2011-10-12 14 views
6

ऑब्जेक्ट वाले दो एरे, सरणी के बीच '' का उपयोग करते समय अंतरण नहीं कर रहे हैं। कृपया नीचे टुकड़ा पर एक नज़र डालें:रूबी सरणी चौराहे

ruby-1.9.2-p290 :001 > class A 
ruby-1.9.2-p290 :002?> include Comparable 
ruby-1.9.2-p290 :003?> attr_reader :key 
ruby-1.9.2-p290 :004?> def initialize(key) 
ruby-1.9.2-p290 :005?>  @key = key 
ruby-1.9.2-p290 :006?>  end 
ruby-1.9.2-p290 :007?> def <=> obj 
ruby-1.9.2-p290 :008?>  @key <=> obj.key 
ruby-1.9.2-p290 :009?>  end 
ruby-1.9.2-p290 :010?> end 
=> nil 
ruby-1.9.2-p290 :011 > class B 
ruby-1.9.2-p290 :012?> attr_reader :key 
ruby-1.9.2-p290 :013?> def initialize(key) 
ruby-1.9.2-p290 :014?>  @key = key 
ruby-1.9.2-p290 :015?>  end 
ruby-1.9.2-p290 :016?> end 
=> nil 
ruby-1.9.2-p290 :017 > A.new(1) == A.new(1) 
=> true 
ruby-1.9.2-p290 :019 > B.new(1) == B.new(1) 
=> false 
ruby-1.9.2-p290 :020 > a1 = [A.new(1), A.new(2), A.new(3)] 
=> [#<A:0x000001009e2f68 @key=1>, #<A:0x000001009e2f40 @key=2>, #<A:0x000001009e2f18 @key=3>] 
ruby-1.9.2-p290 :021 > a2 = [A.new(3), A.new(4), A.new(5)] 
=> [#<A:0x000001009d44e0 @key=3>, #<A:0x000001009d44b8 @key=4>, #<A:0x000001009d4490 @key=5>] 
ruby-1.9.2-p290 :023 > a1 | a2 
=> [#<A:0x000001009e2f68 @key=1>, #<A:0x000001009e2f40 @key=2>, #<A:0x000001009e2f18 @key=3>, #<A:0x000001009d44e0 @key=3>, #<A:0x000001009d44b8 @key=4>, #<A:0x000001009d4490 @key=5>] 
ruby-1.9.2-p290 :024 > a1 & a2 
=> [] 

चाहिए नहीं a1 & a2 वापसी:

[#<A:0x000001009e2f18 @key=3>] 

या, मैं सिर्फ कुछ ...

उत्तर

9

नहीं, आप की जरूरत है याद आ रही है काम करने के लिए Array#& और Array#| के लिए हैश समानता को लागू करने के लिए (केवल सामान्य तुलना के साथ इसे कार्यान्वित करना O(n * m) होगा)। नोटिस Array#| ने गलत परिणाम भी दिया: इसमें डुप्लिकेट शामिल हैं।

इस तरह की समानता विधि इस तरह से लागू किया जा सकता:

def hash 
    @key.hash^A.hash # just to get a different hash than the key 
end 

alias eql? == 

इसके अलावा, अपने <=> विफल रहता है अन्य वस्तु #key का जवाब नहीं है। == विफल नहीं होना चाहिए, अगर दो वस्तुओं की तुलना नहीं की जा सकती है तो इसे झूठी वापसी करनी चाहिए। यह उन तरीकों में से एक है जहां आप respond_to? का उपयोग नहीं करना चाहते हैं, बल्कि is_a?: आप नहीं चाहते कि कोई फिल्म किसी पुस्तक के बराबर हो क्योंकि उनके पास एक ही शीर्षक होना चाहिए।

def <=>(other) 
    @key <=> other.key if other.is_a? A 
end 
+0

मुझे यह समझने में मदद करने के लिए धन्यवाद ... क्या हमें #hash में XOR की आवश्यकता है, क्योंकि मैं इसकी तुलना में # ए की तुलना कर रहा हूं। मुझे लगता है, हम केवल @ key.hash –

+0

रख सकते हैं यह काम करेगा, क्योंकि eql? वैसे भी बुलाया जाएगा। हैश की कुंजी के साथ टकराव से बचने के लिए एक्सोर बस वहां है। यहां तक ​​कि def हैश; 1; अंत काम करेगा, लेकिन प्रदर्शन भयानक होगा। –

संबंधित मुद्दे