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

Pou*_*oul 33 ruby hashmap

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

h = {}
f1 = Foo.new(a,b)
f2 = Foo.new(a,b)
Run Code Online (Sandbox Code Playgroud)

此时f1和f2应该相等.

h[f1] = 7
h[f2] = 8
puts h[f1]
Run Code Online (Sandbox Code Playgroud)

应该打印8

Mar*_*ark 57

http://ruby-doc.org/core/classes/Hash.html

哈希使用key.eql?测试密钥是否相等.如果您需要将自己的类的实例用作Hash中的键,建议您同时定义eql?和哈希方法.哈希方法必须具有a.eql?(b)暗示a.hash == b.hash的属性.

这个eql?方法很容易实现:如果所有成员变量都相同,则返回true.对于哈希方法,请使用[@ data1,@ data2] .hash,正如Marc-Andre在评论中所建议的那样.

  • 好,除了返回的哈希应该是一个fixnum,所以最好使用exclusive或者sum(可能溢出到bignum).或者,使用`Array #hash`,比如`[@ data1,@ data2] .hash`,比方说. (9认同)
  • 它们不是同一个对象,但它们仍然可以定义为"相等".例如,具有相同内容的两个字符串不能是同一个对象,您仍然可以将它们用作键. (2认同)