7

ハッシュのキーとして使用したいいくつかのオブジェクトのラッパークラスがあります。ラップされたオブジェクトとラッパー解除されたオブジェクトは、同じキーにマップする必要があります。

簡単な例は次のとおりです。

class A
  attr_reader :x
  def initialize(inner)
    @inner=inner
  end
  def x; @inner.x; end
  def ==(other)
    @inner.x==other.x
  end
end
a = A.new(o)  #o is just any object that allows o.x
b = A.new(o)
h = {a=>5}
p h[a] #5
p h[b] #nil, should be 5
p h[o] #nil, should be 5

私は==、===、eqを試しましたか?そして、すべてを無駄にハッシュします。

4

2 に答える 2

6

ハッシュはkey.eqlを使用しますか?キーが等しいかどうかをテストします。独自のクラスのインスタンスをハッシュのキーとして使用する必要がある場合は、両方のeql?を定義することをお勧めします。およびハッシュメソッド。ハッシュメソッドには、a.eql?(b)がa.hash==b.hashを意味するというプロパティが必要です。

それで...

class A
  attr_reader :x
  def initialize(inner)
    @inner=inner
  end
  def x; @inner.x; end
  def ==(other)
    @inner.x==other.x
  end

  def eql?(other)
    self == other
  end

  def hash
    x.hash
  end
end
于 2012-06-28T14:54:22.317 に答える
5

と を定義する必要がありeql?ますhash

のドキュメントHashは不足していましたが、最近改善されました。

于 2012-06-28T14:45:34.733 に答える