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?测试键是否相等。如果您需要使用自己的类的实例作为 Hash 中的键,建议您同时定义 eql? 和哈希方法。hash 方法必须具有 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 回答