我有一个Foo类,它有几个成员变量。当类的两个示例中的所有值都相等时,我希望对象“相等”。然后我希望这些对象成为我的哈希中的键。当我目前尝试这个时,哈希将每个示例视为不相等。
h = {} f1 = Foo.new(a,b) f2 = Foo.new(a,b)
字符串此时f1和f2应该相等。
h[f1] = 7 h[f2] = 8 puts h[f1]
型应打印8
q43xntqr1#
参见Hash:哈希使用key.eql?来测试密钥是否相等。如果您需要使用自己的类的示例作为Hash中的键,建议您同时定义eql?和hash方法。哈希方法必须具有a.eql?(b)隐含a.hash == b.hash的属性。eql?方法很容易实现:return true如果所有成员变量都相同。对于hash方法,请使用[@data1, @data2].hash,正如Marc-Andre在评论中建议的那样。
Hash
key.eql?
eql?
hash
a.eql?(b)
a.hash == b.hash
return true
[@data1, @data2].hash
6yoyoihd2#
在类中添加一个名为'hash'的方法:
class Foo def hash return whatever_munge_of_instance_variables_you_like end end
字符串这将按照您请求的方式工作,并且不会为不同但相同的对象生成不同的哈希键。
2条答案
按热度按时间q43xntqr1#
参见
Hash
:哈希使用
key.eql?
来测试密钥是否相等。如果您需要使用自己的类的示例作为Hash
中的键,建议您同时定义eql?
和hash
方法。哈希方法必须具有a.eql?(b)
隐含a.hash == b.hash
的属性。eql?
方法很容易实现:return true
如果所有成员变量都相同。对于hash
方法,请使用[@data1, @data2].hash
,正如Marc-Andre在评论中建议的那样。6yoyoihd2#
在类中添加一个名为'hash'的方法:
字符串
这将按照您请求的方式工作,并且不会为不同但相同的对象生成不同的哈希键。