2015-04-02 117 views
-5

我知道Class定義了===來測試一個對象是否是該類的一個實例。===如何在Ruby中工作?

現在的問題是爲什麼只有Class是左手操作數纔會評估爲true

實施例:

'a' === String #false 

String === 'a' #true 

def Foo 
end 

f = Foo.new 
f === Foo #false 
Foo === f #true 
+1

http://gilesbowkett.blogspot.com/2007/11/what-is-threequals.html。 TLDR:不要使用它。對於Class來說,它的定義是檢查右側是否是實例,但對於String來說,===被定義爲檢查是否相等。 – 2015-04-02 04:36:45

+2

你問這個問題的唯一原因是因爲方法名稱===和==相似。你會問爲什麼'3/2'與'2/3'不一樣? 'String ==='abc''是'String。===('abc')'的snytactic糖。如果該方法被命名爲'triple_equal',我們可以像這樣使用它:'String.triple_equal('abc')'。你會問,如果這應該是相同的''abc'.triple_equal(String)'? – 2015-04-02 04:52:58

+0

@AmitKumarGupta,'...但是對於String,=== ...'有點混亂。我知道你指的是兩個字符串的比較,但讀者可能認爲你的意思是'String ==='cat''。 – 2015-04-02 04:58:04

回答

9

由於

  • String === 'a'String.===('a')相同,它調用Class#===,從Module#===繼承來測試參數是否從接收模塊繼承;和

  • 'a' === String相同'a'.===(String),它調用String#===,從Object#===繼承來測試參數是否等於接收器對象。

換句話說,===是不對稱的; Object#===Module#===是非常不同的方法。還有Regexp#===,Proc#=== ......也做非常不同的事情,也是不對稱的(匹配模式,用參數執行)。