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
如果您想知道是否存在匹配以及如果存在,它从哪里开始怎么办?
我主要使用 ===
将值与 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
如果您想知道是否存在匹配以及如果存在,它从哪里开始怎么办?