2012-03-25 56 views
1

Ruby syntax reference說,關於case語句:爲什麼「foo」不是===到/ foo /當比賽成功的情況下?

比較是由運營商完成===

INFACT,例如:

ruby -e 'puts (1..3) === 2' 

打印true,但:

ruby -e 'puts "foo" === /foo/' 

個打印false,也:

ruby -e 'puts :foo === /foo/' 

打印false,但所有這些例子都是case語句成功的條件。它是如何工作的?

+0

嘗試'/ foo/===「foo」'。你的想法如何'案件'工作改變?請記住,只有* receiver *在Ruby中是隱式多態的,並且'a === b'實際上是'a .__ send __(:===,b)'。 – 2012-03-25 22:34:37

+0

我沒有考慮訂單>。<謝謝 – mdesantis 2012-03-25 22:55:42

回答

7

===運營商是不可交換,這意味着"foo" === /foo//foo/ === "foo"是兩個非常不同的東西。並且case語句使用後者的順序。

事實上,您的第一個使用範圍的示例已經顯示正在使用該訂單。 2 === (1..3)將無法​​正常工作,就像您的第二個和第三個示例不一樣。

訂單選擇的原因也很明顯,至少如果您熟悉Ruby和OO設計中的運算符是如何工作的。

===操作是正常的方法,所以寫/foo/ === "foo"的另一種方式是/foo/.===("foo") - 而這個順序是有意義的,因爲正則表達式不知道這是否是一個字符串匹配,但字符串沒有正則表達式和沒有按」的概念不知道它是否會被匹配。擴展到你的第一個例子,範圍確實知道一個元素是否是其中的一部分,但是一個元素不知道它是否是範圍的一部分。

+0

我覺得我錯過了一些明顯的東西。謝謝 – mdesantis 2012-03-25 22:54:05

相關問題