2012-09-15 32 views
6

對不起,如果重複(我沒有找到它)Ruby中的「==」總是值相等嗎?

這只是爲了確認Ruby的運算符==始終執行相等比較。 也就是說

a == b 

a的值對B的值進行比較,而不是比,如Java,他們是否指向同一個對象在內存中(對於後一件事,在Ruby中,你應該使用a.object_id == b.object_id)。

因此,其結果是安全的字符串值與== Ruby的比較(雖然它是不是安全在Java中這樣做)

感謝

編輯

問題在於任何Ruby對象的默認==行爲,因爲它可能誤導Java-C-C++程序員,假設==b比較引用本身而不是參考內容。

無論如何,你可以看看這個代碼,使用字符串

one="hello" 
two="he" 
two << "llo" 

if one == two 
    puts "surprise: comparing values, not like in Java" 
end 

if not one.object_id == two.object_id 
    puts "obvious: do this to compare references" 
end 

編輯2

所以,在Ruby中,比較

a == b 

檢查A和B的值

但是,分配

a = b 

不復制值,但使a和b點同一個對象!

與以前的代碼

puts one.object_id 
puts two.object_id 

puts " and now " 

one = two 

puts one.object_id 
puts two.object_id 
+1

是的。 http://stackoverflow.com/questions/1710369/most-concise-way-to-test-string-equality-not-object-equality-for-ruby-strings – nneonneo

+1

引用的鏈接不是重複的這個問題...... –

+0

是的,我意識到的第一件事是在Ruby中,運算符'=='和函數'equals'與C語言中的預期結果相反。 – EliuX

回答

3

在Ruby中繼續,==可以被重載,因此它可以做任何事情的類的設計者你比較願意做的事。在這方面,它與Java的equals()方法非常相似。

約定是==做價值比較,大多數類遵循約定,String包括。所以你是對的,使用==來比較字符串將做預期的事情。

約定是爲equal?做參考比較,所以你的測試a.object_id == b.object_id也可以寫成a.equal?(b)。 (該equal?方法可以定義做一些非標準的,但話又說回來,這樣可以object_id!)

(旁註:當你發現自己在Ruby中比較字符串時,你經常應該已經用符號代替)

+0

Downvoter:請解釋!如果我的答案有任何問題,我很樂意照亮:) – Thomas

1

來自http://www.skorks.com/2009/09/ruby-equality-and-object-comparison/

的代碼:

class MyObject 
end 
object1 = MyObject.new 
object2 = object1 
object3 = MyObject.new 

puts "Object 1 is == to object 2: #{object1 == object2}" 
puts "Object 1 is eql? to object 2: #{object1.eql? object2}" 
puts "Object 1 is equal? to object 2: #{object1.equal? object2}" 
puts "Object 1 is == to object 3: #{object1 == object3}" 
puts "Object 1 is eql? to object 3: #{object1.eql? object3}" 
puts "Object 1 is equal? to object 3: #{object1.equal? object3}" 

輸出:

Object 1 is == to object 2: true 
Object 1 is eql? to object 2: true 
Object 1 is equal? to object 2: true 
Object 1 is == to object 3: false 
Object 1 is eql? to object 3: false 
Object 1 is equal? to object 3: false 

編輯 - 附加輸出:

irb(main):001:0> class MyObject 
irb(main):002:1> end 
=> nil 
irb(main):003:0> object1 = MyObject.new 
=> #<MyObject:0x281bc08> 
irb(main):006:0> object1.respond_to?('=='.to_sym) 
=> true 
irb(main):007:0> object1.respond_to?('eql?'.to_sym) 
=> true 
irb(main):013:0> MyObject.superclass 
=> Object 
+1

這是誤導,因爲'MyObject'沒有正確定義任何這些方法。 – Thomas

+0

是的,它確實......見編輯... –

+1

「正確」我的意思是「根據約定」,即:「相等?」引用相等,「eql?」值相等,並且「==」執行值類型轉換。上面的文章(http://www.skorks.com/2009/09/ruby-equality-and-object-comparison/)解釋了這一點,但只是這段代碼缺乏實際回答問題的上下文。 – Thomas

0

根據噸○ 「Ruby編程語言」(那根&松本) 節4.6.7頁面106

==是相等運算。根據左手操作數的「等於」定義,它確定兩個值是否相等。

而在3.8.3第74頁:

每個對象都有一個對象標識符,一個Fixnum,你可以得到 與OBJECT_ID方法。此方法返回的值爲 常量,並且對於該對象的生命週期是唯一的。

所以,這與Java相反(我感到驚訝)。