在比较密钥时,Ruby的Hash使用哪种相等性测试?

时间:2012-06-28 14:36:07

标签: ruby hash equals equality

我有一个围绕某些对象的包装类,我想将它们用作Hash中的键。包装和解包对象应该映射到相同的键。

一个简单的例子是:

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?哈希都无济于事。

2 个答案:

答案 0 :(得分:4)

您必须定义eql?hash

Hash的文档缺少has been improved recently

答案 1 :(得分:4)

  

哈希使用key.eql?测试密钥是否相等。如果你需要使用   您自己的类的实例作为Hash中的键,建议使用   你定义了两个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