2010-03-27 8 views
5

यहाँ कुछ उदाहरण कोड है:रुबी के ऐरे कैसे हैं समानता के लिए तत्वों की तुलना करें?

class Obj 
    attr :c, true 

    def == that 
    p '==' 
    that.c == self.c 
    end 
    def <=> that 
    p '<=>' 
    that.c <=> self.c 
    end 
    def equal? that 
    p 'equal?' 
    that.c.equal? self.c 
    end 
    def eql? that 
    p 'eql?' 
    that.c.eql? self.c 
    end 
end 

a = Obj.new 
b = Obj.new 

a.c = 1 
b.c = 1 

p [a] | [b] 

यह 2 वस्तुओं प्रिंट लेकिन यह 1 वस्तु प्रिंट चाहिए। तुलनात्मक तरीकों में से कोई भी नहीं कहा जाता है। ऐरे कैसे है समानता की तुलना?

उत्तर

6

Array#| hashs का उपयोग कर कार्यान्वित किया जाता है। इसलिए आपके प्रकार के साथ अच्छी तरह से काम करने के लिए (साथ ही हैशैप्स और हैशसेट्स के साथ), आपको eql? (जो आपने किया था) और hash (जिसे आपने नहीं किया) लागू करना होगा। हैश को परिभाषित करने का सबसे सीधा तरीका तरीका है कि c.hash वापस लौटना होगा।

+0

बस पुष्टि करने के लिए - रूबी के ऐरे # हैश विधि की गारंटी है कि मान बराबर होंगे यदि केवल और यदि सरणी की सामग्री बराबर होती है? –

+0

@EricWalker सं। यह गारंटी है कि दो एरे के हैंश बराबर हैं (लेकिन केवल तभी नहीं) दोनों सरणी में एक ही क्रम में समान हैश मान वाले तत्व होते हैं। हालांकि यह इस सवाल से असंबंधित है क्योंकि यहां हैश केवल तत्वों पर बुलाया जाता है, कभी भी सरणी पर नहीं। – sepp2k

1

रूबी की ऐरे क्लास सी में लागू की गई है, और जो मैं बता सकता हूं, | में ऑब्जेक्ट की तुलना करते समय समानता की जांच करने के लिए कस्टम हैश तालिका का उपयोग करता है। यदि आप इस व्यवहार को संशोधित करना चाहते हैं, तो आपको अपना खुद का संस्करण लिखना होगा जो आपकी पसंद की समानता जांच का उपयोग करता है।

रूबी के Array#| का पूरा कार्यान्वयन देखने के लिए: click here और के लिए खोज "rb_ary_or(VALUE ary1, VALUE ary2)"

0

रूबी हैश फ़ंक्शंस को कॉल कर रहा है और वे अलग-अलग मान वापस कर रहे हैं, क्योंकि वे अभी भी डिफ़ॉल्ट ऑब्जेक्ट_आईडी वापस कर रहे हैं। आपको def hash की आवश्यकता होगी और ओब्ज को महत्वपूर्ण बनाने के बारे में आपके विचार को प्रतिबिंबित करने के लिए कुछ ऐसा लौटाएगा।

>> class Obj2 < Obj 
>> def hash; t = super; p ['hash: ', t]; t; end 
>> end 
=> nil 
>> x, y, x.c, y.c = Obj2.new, Obj2.new, 1, 1 
=> [#<Obj2:0x100302568 @c=1>, #<Obj2:0x100302540 @c=1>, 1, 1] 
>> p [x] | [y] 
["hash: ", 2149061300] 
["hash: ", 2149061280] 
["hash: ", 2149061300] 
["hash: ", 2149061280] 
[#<Obj2:0x100302568 @c=1>, #<Obj2:0x100302540 @c=1>] 
संबंधित मुद्दे