2010-08-02 64 views
9

在Java中,==是最強的一種相等(指針相等):a == b總是暗示a.equals(b)。然而,在Ruby中,==.equals?弱:在Ruby中做什麼==?

ruby-1.9.2-rc2 > 17 == 17.0 
=> true 
ruby-1.9.2-rc2 > 17.equal?(17.0) 
=> false 

所以,我在哪裏可以瞭解更多有關==?當我比較兩個對象時,我應該期待什麼樣的檢查?

回答

8

簡要這是你需要知道:

==比較檢查兩個值是否相等

eql?檢查,如果兩個值相等同類型的和

equal?檢查兩事物是同一個對象。

一個很好的博客是here

+2

似乎他們可以選擇更好的eql方法名稱?和平等? – 2010-08-02 17:33:58

+1

CLISP更糟糕:'eq','eql','equal','equalp'和'='。雖然有更好的命名操作符,比如'string-equal'和'tree-equal'。 – 2010-08-02 17:58:11

+0

好的,所以我不應該使用'=='比較兩個對象?但是即使'5'是Ruby中的一個對象......所以使用'=='比較安全的是什麼?字符串和數字,當然。數組呢?哈希? – 2010-08-05 17:34:01

1

實際上它們都只是方法 ==表示 對象。==(other_object) 等於?裝置 的Object.Equals?(other_object)

在這種情況下,雖然,等於基本上用於散列查詢比較 即 a_hash [1]不應該是相同的密鑰值對a_hash [1.0]

HTH。 -r

0
jruby-1.5.0 > 17 ==17 
=> true 
jruby-1.5.0 > 17 == 17.0 
=> true 
jruby-1.5.0 > 17 === 17.0 
=> true 
jruby-1.5.0 > 17.equal?(17.0) 
=> false 
jruby-1.5.0 > 17.id 
=> 35 
jruby-1.5.0 > (17.0).id 
(irb):12 warning: Object#id will be deprecated; use Object#object_id 
=> 2114 

ruby​​中的一切都是一個對象。對象17與17.0不是同一個對象並且相等?比較對象,而不是對象的值。

1

==簡而言之就是一種方法。我認爲這是解釋真的很好here

通常情況下,這種方法在派生類中重寫提供類特定的含義。

Numeric是一個例子沿。

雖然這裏有一個缺陷:因爲==是左操作數的一種方法,所以假設a==b的結果應該與b==a的結果相同並不總是安全的。尤其是在a是一個方法調用的情況下,在Ruby等動態語言中,它不一定總是返回相同類型的值。