【问题标题】:Ruby =~ vs === OperatorsRuby =~ vs === 运算符
【发布时间】:2016-02-21 04:28:27
【问题描述】:

我主要使用=== 将值与Ruby 中的模式进行匹配。最近,我发现该语言还支持正则表达式的=~ 运算符。

Ruby Documentation=== 定义为“大小写相等”,将 =~ 定义为“模式匹配”。

Case Equality – 对于类 Object,实际上与调用 #== 相同,但通常被后代覆盖以在 case 语句中提供有意义的语义。

模式匹配——被后代(特别是正则表达式和字符串)覆盖以提供有意义的模式匹配语义。

通过实验,我发现=== 适用于正则表达式、类名、字面值甚至范围,而=~ 似乎只返回对正则表达式有用的值。我的问题是:我为什么要使用=~?似乎=== 支持=~ 所做的一切,然后是一些。我在这里遗漏了什么=~ 打算做不同的事情吗?

【问题讨论】:

  • regexp =~ strregexp === str 在我的系统上返回完全不同的结果。

标签: ruby regex operator-overloading


【解决方案1】:

首先,=~ 是对称的:

'string' =~ /regex/

/regex/ =~ 'string'

两者都有效。

其次,正如您所说,=== 与其他类一起使用。如果要匹配字符串,则应使用运算符 for... 匹配。它被称为 case 运算符是有原因的 - case 在内部使用它。

case foo
when bar then x
when baz then y
else z
end

等同于:

if bar === foo
  x
elsif baz === foo
  y
else
  z
end

明确使用=== 被视为unidiomatic

【讨论】:

  • 来自documentation“注意:str =~ regexpregexp =~ str 不同。从命名捕获组捕获的字符串仅在第二种情况下分配给局部变量。”
  • @Stefan,很有趣。知道为什么会这样吗?
  • 必须是一些内部限制。根据Regexp#=~,隐式变量赋值由Ruby解析器处理。
【解决方案2】:
str = "Something is amiss."
r = /me/

r === str #=> true
str =~ r  #=> 2

如果你想知道是否有匹配,如果有,从哪里开始?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    • 1970-01-01
    • 2012-01-20
    • 2012-08-04
    • 2016-06-27
    • 2013-07-04
    • 2012-01-24
    相关资源
    最近更新 更多