2016-02-19 59 views
2

我一直在使用===來爲Ruby中的模式匹配值。最近,我發現該語言還支持正則表達式的=~運算符。Ruby =〜vs ===運算符

Ruby Documentation===定義爲「殼體平等」和=~爲「圖案匹配」。

案例平等 - Object類,有效地與調用#==,但通常由後人覆蓋到case語句提供明確的語義。

模式匹配 - 由後代(特別是Regexp和String)重寫以提供有意義的模式匹配語義。

通過實驗,我發現===作品的正則表達式,類名稱,面值,甚至範圍,而=~似乎只對正則表達式返回有用的值。我的問題是:爲什麼我會使用=~?看起來好像===支持一切=~確實,然後一些。有什麼我在這裏錯過=~打算做不同?

+0

'regexp =〜str'和'regexp === str'在我的系統上返回完全不同的結果。 – Stefan

回答

4

首先,=~是對稱的:

'string' =~ /regex/ 

而且

/regex/ =~ 'string' 

兩個工作。

其次,如您所述,===與其他類一起工作。如果你想匹配字符串,你應該使用運算符來...匹配。由於某種原因稱爲案例操作員 - 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

+1

從[documentation](http://ruby-doc.org/core-2.3.0/String.html#method-i-3D-7E):*「注意:'str =〜regexp'是不一樣的作爲'regexp =〜str'。只有在第二種情況下,從命名捕獲組捕獲的字符串纔會被分配給局部變量。「* – Stefan

+0

@Stefan,有趣。任何想法爲什麼這樣? – ndn

+0

必須是一些內部限制。根據['Regexp#=〜'](http://ruby-doc.org/core-2.3.0/Regexp.html#method-i-3D-7E),隱式變量賦值由Ruby解析器處理。 – Stefan

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

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

如果你想知道是否有匹配,如果是,從哪裏開始?