Hash方法使用了什么相等的东西?

时间:2014-02-13 15:49:43

标签: ruby hash

我有课程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

我测试下面的f1f2与两种方法相同:

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?中使用的等式方法是什么?

2 个答案:

答案 0 :(得分:2)

包含Ruby的散列类型的大多数实现首先依赖于哈希(对于速度!)然后依赖于等式检查。要验证它是否有效,首先,您只需添加

即可
def hash
    1
end

之后,您应该为hash提供尽可能多的不同返回值,如果对象被认为是相等的,那么这些返回值仍然相等(当然,只要它很快)。

答案 1 :(得分:2)

它使用hash方法。您可以在那里连接对象的属性或类似的东西。在您的情况下,当且仅当它们相等时,您希望哈希值对于2个对象是相同的。