在比较密钥时,Ruby的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 ox b = A.new(o) h = {a=>5} ph[a] #5 ph[b] #nil, should be 5 ph[o] #nil, should be 5 

我试过==,===,eq? 哈希都无济于事。

哈希使用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 

你必须定义eql?hash

Hash的文档缺乏,但最近有所改进 。