2012-09-15 21 views
6

क्षमा करें अगर डुप्लिकेट (मुझे यह नहीं मिला)क्या रूबी में "==" हमेशा समानता का महत्व है?

यह केवल यह पुष्टि करने के लिए है कि रूबी के ऑपरेटर == हमेशा समानता तुलना करता है। आईई।

a == b 

, ख के मूल्य के खिलाफ एक के मूल्य की तुलना बजाय से, जावा की तरह, चाहे वे स्मृति में एक ही वस्तु को इंगित (यह बाद बात के लिए, रूबी में, आप a.object_id == b.object_id का उपयोग करना चाहिए)।

:

इस प्रकार, एक परिणाम के रूप में यह रूबी में == साथ स्ट्रिंग मानों की तुलना करने

धन्यवाद

संपादित (जबकि यह सुरक्षित जावा में ऐसा करने के लिए नहीं है) के लिए सुरक्षित है सवाल किसी भी रूबी ऑब्जेक्ट के लिए डिफ़ॉल्ट == व्यवहार पर है, क्योंकि यह जावा-सी-सी ++ प्रोग्रामर को गुमराह कर सकता है, जो कि == बी संदर्भ संदर्भों को संदर्भित करता है, संदर्भ सामग्री नहीं।

वैसे भी, आप इस कोड की जाँच कर सकते हैं, तार

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 का उपयोग कर।

तो, रूबी, तुलना

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

हां पहली बात यह है कि मुझे एहसास हुआ कि ऑपरेटर '==' रूबी में और फ़ंक्शन 'बराबर' सी की तरह भाषाओं में अपेक्षा की जाती है। – EliuX

उत्तर

3

रूबी के साथ जारी ==, अतिभारित किया जा सकता है, तो यह कुछ भी वर्ग के डिजाइनर कर सकता है आप तुलना कर रहे हैं यह करने के लिए चाहता है। उस संबंध में, यह जावा की equals() विधि के समान ही है।

सम्मेलन मूल्य तुलना करने के लिए == के लिए है, और अधिकांश वर्ग उस सम्मेलन का पालन करते हैं, String शामिल हैं। तो आप सही हैं, स्ट्रिंग की तुलना करने के लिए == का उपयोग करके अपेक्षित चीज होगी। तो अपने परीक्षण a.object_id == b.object_id भी a.equal?(b) लिखा जा सकता है

सम्मेलन, equal? संदर्भ तुलना करने के लिए है। (equal? विधि कुछ गैरमानक करने के लिए परिभाषित किया जा सकता है, लेकिन फिर, इसलिए object_id सकते हैं!)

(साइड नोट:। जब आप पाते हैं अपने आप को रूबी में तार की तुलना, आप अक्सर बजाय प्रतीकों का उपयोग किया जाना चाहिए था)

+0

डाउनवॉटर: कृपया समझाएं! अगर मेरे उत्तर में कुछ भी गलत है, तो मुझे रोशनी होना अच्छा लगेगा :) – 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

अनुसार टी ओ "रूबी प्रोग्रामिंग भाषा" (फ्लानागन & मात्सुमोतो), खंड 4.6.7 पेज 106

== समानता ऑपरेटर है। यह निर्धारित करता है कि "बराबर" की लेफ्टेंडेंड ऑपरेंड की परिभाषा के अनुसार, दो मान बराबर हैं या नहीं।

और 3.8.3 पेज 74 में:

हर वस्तु एक वस्तु पहचानकर्ता के Fixnum, कि तुम object_id विधि के साथ प्राप्त कर सकते है। इस विधि द्वारा लौटाया गया मान ऑब्जेक्ट के जीवनकाल के लिए निरंतर और अद्वितीय है।

तो, यह जावा (मुझे आश्चर्यचकित) के विपरीत काम करता है।