我有一个Foo类,里面有一些成员变量。当类的两个实例中的所有值相等时,我希望对象“相等”。然后,我想将这些对象作为哈希中的键。当我正在尝试这个时,哈希将每个实例视为不相等。
h = {}
f1 = Foo.new(a,b)
f2 = Foo.new(a,b)
此时f1和f2应该相等。
h[f1] = 7
h[f2] = 8
puts h[f1]
应该打印8
答案 0 :(得分:56)
请参阅http://ruby-doc.org/core/classes/Hash.html
哈希使用key.eql?测试密钥 平等。如果您需要使用实例 你自己的类作为哈希中的键, 建议您同时定义它们 eql?和哈希方法。哈希 方法必须具有该属性 a.eql?(b)暗示a.hash == b.hash。
eql?方法很容易实现:如果所有成员变量都相同,则返回true。对于哈希方法,请使用[@ data1,@ data2] .hash作为Marc-Andre在评论中的建议。
答案 1 :(得分:-3)
在您的班级中添加一个名为'hash'的方法:
class Foo
def hash
return whatever_munge_of_instance_variables_you_like
end
end
这将以您请求的方式工作,并且不会为不同但相同的对象生成不同的哈希键。