2011-06-27 65 views
1

可能重複:
=== vs. == in Ruby2比較對象時,有什麼==之間的差異===

Fixnum == 2.class 
#=> true 

Fixnum === 2.class 
#=> false 

爲什麼===不起作用?我怎麼能知道這個方法===屬於(現在我想它會調用Object#==Object#===),但是我怎麼能確定它?

+0

我會假設'=='意味着他們有相同的價值,而'==='意味着他們是同一個對象? – TyrantWave

+1

由於在SO之前已經回答了很多次,'==='也考慮了對象的類型。 –

+1

@TyrantWave和@Ash - '==='沒有用於類型檢查的細節。當它在'Object'的子類中重寫時。例如,'Range#==='在對象上包含'include?'。它不關心在這種情況下的類型 –

回答

4

重複:

案例平等。請參閱Object#===的文檔。這種方法通常在Object的子類中被覆蓋。例如,Module#===

Case Equality - 如果anObject是mod的實例或mod的後代之一,則返回true。模塊的用途有限,但可用於case語句以按類別對對象進行分類。

>> Module.new === Module 
=> false 
>> Module === Module.new 
=> true 

Regexp#===是另外一個,在這種情況下,它的=~的代名詞:

a = "HELLO" 
case a 
when /^[a-z]*$/; print "Lower case\n" 
when /^[A-Z]*$/; print "Upper case\n" 
else;   print "Mixed case\n" 
end 

在IRB的一個例子:

>> "a" === /a/ 
=> false 
>> /a/ === "a" 
=> true 

記住,第一個返回false,因爲你在上String這不是一回事。在第二個例子中,我們在Regexp

最後做===Range是相當不錯的一個,它調用Range對象上include?和傳遞你的價值:

>> (1..100) === 3 
=> true 
>> (1..100) === 300 
=> false 

對於這些列表,檢查出RubyDoc.info核心文檔和搜索===在方法區域在左側框架

0

==通常只檢查兩個參數的值,當====檢查類型時。

+0

'==='不檢查類型,除非其中一個子類已經覆蓋它以這種方式工作 –