Ruby = ~vs ===运算符

Sil*_*olo 3 ruby regex operator-overloading

我大部分时间都在使用===Ruby中的模式匹配值.最近,我发现该语言还支持=~运算符的正则表达式.

Ruby文档定义===为"壳体平等"和=~为"图案匹配".

Case Equality - 对于Object类,实际上与调用#==相同,但通常由后代重写,以在case语句中提供有意义的语义.

模式匹配 - 由后代(特别是Regexp和String)覆盖,以提供有意义的模式匹配语义.

通过实验,我发现它===适用于正则表达式,类名,文字值甚至范围,而=~似乎只返回正则表达式的有用值.我的问题是:我为什么要用=~?它似乎===支持一切=~,然后一些.我在这里缺少=~哪些意图以不同的方式做什么?

ndn*_*kov 6

首先=~是对称的:

'string' =~ /regex/
Run Code Online (Sandbox Code Playgroud)

/regex/ =~ 'string'
Run Code Online (Sandbox Code Playgroud)

两者都有效.

其次,如您所述,===与其他类一起使用.如果要匹配字符串,则应使用运算符进行...匹配.它被称为case运算符有一个原因 - case在内部使用它.

case foo
when bar then x
when baz then y
else z
end
Run Code Online (Sandbox Code Playgroud)

是相同的:

if bar === foo
  x
elsif baz === foo
  y
else
  z
end
Run Code Online (Sandbox Code Playgroud)

明确使用===被认为是单一的.