Ruby =~ 与 === 运算符

Ruby =~ vs === Operators

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

Ruby Documentation=== 定义为 "case equality",将 =~ 定义为 "pattern match"。

Case Equality – For class Object, effectively the same as calling #==, but typically overridden by descendants to provide meaningful semantics in case statements.

Pattern Match—Overridden by descendants (notably Regexp and String) to provide meaningful pattern-match semantics.

通过实验,我发现 === 适用于正则表达式、class 名称、文字值,甚至范围,而 =~ 似乎只对 return 有用正则表达式的值。我的问题是:我为什么要使用 =~?似乎 === 支持 =~ 所做的一切,然后是一些。 =~ 有什么不同之处吗?

首先,=~是对称的:

'string' =~ /regex/

/regex/ =~ 'string'

两者都有效。

其次,如您所述,=== 与其他 类 一起工作。如果你想匹配字符串,你应该使用 operator for... 匹配。它被称为案例运算符是有原因的 - 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

str = "Something is amiss."
r = /me/

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

如果您想知道是否存在匹配以及如果存在,它从哪里开始怎么办?