Ruby=~vs==运算符
我主要使用Ruby=~vs==运算符,ruby,regex,operator-overloading,Ruby,Regex,Operator Overloading,我主要使用==将值与Ruby中的模式进行匹配。最近,我发现该语言还支持正则表达式的=~操作符 将===定义为“大小写相等”,将=~定义为“模式匹配” Case Equality–对于类对象,实际上与调用#==相同,但通常由后代覆盖,以在Case语句中提供有意义的语义 模式匹配由子体(特别是Regexp和String)覆盖,以提供有意义的模式匹配语义 通过实验,我发现==适用于正则表达式、类名、文本值甚至范围,而=~似乎只返回正则表达式的有用值。我的问题是:为什么我会使用=~?似乎===支持=~所
==
将值与Ruby中的模式进行匹配。最近,我发现该语言还支持正则表达式的=~
操作符
将===
定义为“大小写相等”,将=~
定义为“模式匹配”
Case Equality–对于类对象,实际上与调用#==相同,但通常由后代覆盖,以在Case语句中提供有意义的语义
模式匹配由子体(特别是Regexp和String)覆盖,以提供有意义的模式匹配语义
通过实验,我发现
==
适用于正则表达式、类名、文本值甚至范围,而=~
似乎只返回正则表达式的有用值。我的问题是:为什么我会使用=~
?似乎===
支持=~
所做的一切,然后是一些。我在这里缺少的东西是不是有不同的意图?首先,=~
是对称的:
'string' =~ /regex/
及
两者都有效
第二,正如您所指出的,==
与其他类一起工作。如果要匹配字符串,应使用运算符。。。匹配。它被称为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
考虑显式使用==
如果您想知道是否存在匹配,如果存在,从何处开始?
regexp=~str
和regexp===str
在我的系统上返回完全不同的结果。从:注意:str=~regexp
与regexp=~str
不同。从命名捕获组捕获的字符串仅在第二种情况下分配给局部变量。“@Stefan,很有意思。知道为什么会这样吗?必须有一些内部限制。根据Ruby解析器处理隐式变量分配。
if bar === foo
x
elsif baz === foo
y
else
z
end
str = "Something is amiss."
r = /me/
r === str #=> true
str =~ r #=> 2