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