我有课程Foo
,我重载了两个方法==
和eql?
:
class Foo
def initialize(bar)
@bar = bar
end
def bar
@bar
end
def ==(o)
self.bar == o.bar
end
def .eql?(o)
return ==(o)
end
end
我测试下面的f1
和f2
与两种方法相同:
u = User.find(12345)
f1 = Foo.new(u)
f2 = Foo.new(u)
f1 == f2 # => true
f1.eql?(f2) # => true
但是Hash#has_key?
并不能使它们相等:
{f1 => true}.has_key?(f2) # => false
Hash#has_key?
中使用的等式方法是什么?
答案 0 :(得分:2)
包含Ruby的散列类型的大多数实现首先依赖于哈希(对于速度!)然后依赖于等式检查。要验证它是否有效,首先,您只需添加
即可def hash
1
end
之后,您应该为hash
提供尽可能多的不同返回值,如果对象被认为是相等的,那么这些返回值仍然相等(当然,只要它很快)。
答案 1 :(得分:2)
它使用hash
方法。您可以在那里连接对象的属性或类似的东西。在您的情况下,当且仅当它们相等时,您希望哈希值对于2个对象是相同的。