gpt4 book ai didi

ruby - Ruby 的 Hash 在比较键时使用哪种相等性测试?

转载 作者:数据小太阳 更新时间:2023-10-29 07:13:47 26 4
gpt4 key购买 nike

我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。

一个简单的例子是这样的:

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?并散列所有无济于事。

最佳答案

Hash uses key.eql? to test keys for equality. If you need to use instances of your own classes as keys in a Hash, it is recommended that you define both the eql? and hash methods. The hash method must have the property that a.eql?(b) implies 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

关于ruby - Ruby 的 Hash 在比较键时使用哪种相等性测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11247000/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com