如何在Ruby中使对象实例成为哈希键?

时间:2010-02-24 19:02:14

标签: ruby hashmap

我有一个Foo类,里面有一些成员变量。当类的两个实例中的所有值相等时,我希望对象“相等”。然后,我想将这些对象作为哈希中的键。当我正在尝试这个时,哈希将每个实例视为不相等。

h = {}
f1 = Foo.new(a,b)
f2 = Foo.new(a,b)
此时

f1和f2应该相等。

h[f1] = 7
h[f2] = 8
puts h[f1]

应该打印8

2 个答案:

答案 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

这将以您请求的方式工作,并且不会为不同但相同的对象生成不同的哈希键。