2011-10-12 8 views
6

オブジェクトを含む2つの配列は、配列間に '&'を使用すると交差しません。 は、以下のスニペットを見てみてください。Ruby配列の交差

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#|も誤った結果を返しました。重複が含まれています。他のオブジェクトが#keyに応答しない場合、あなたの<=>は失敗し、また

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

alias eql? == 

このような平等法は、このように実装することができます。 ==は失敗しません.2つのオブジェクトを比較できない場合はfalseを返します。これは、respond_to?を使用したくない方法の1つで、is_a?です。同じタイトルがあるため、映画は本と同じにしたくありません。

+0

私はこれを理解してくれてありがとうございます。私は2つのAを#keyで比較しているので、#hashでXORが必要ですか?私は思う、私たちは@ key.hashを維持することができます –

+0

それは、eqlのために働くだろうか?とにかく呼び出されます。 xorは、ハッシュの鍵との衝突を避けるために存在します。 defハッシュ; 1;エンドは機能しますが、パフォーマンスはひどいでしょう。 –