EQL?覆盖在Hash中不起作用

时间:2016-03-05 10:58:57

标签: ruby

Hash使用eql?检查其密钥:

foo = 'str'
bar = 'str'

foo.equal?(bar)   #=> false
foo.eql?(bar)     #=> true

h = { foo => 1 }
h[foo]            #=> 1
h[bar]            #=> 1

但是,如果我将自己的班级用作关键词,那么这不起作用:

class Cl
    attr_reader :a
    def initialize(a)
        @a = a
    end
    def eql?(obj)
        @a == obj.a
    end
end

foo = Cl.new(10)
bar = Cl.new(10)

foo.equal?(bar)   #=> false
foo.eql?(bar)     #=> true

h = { foo => 1 }
h[foo]            #=> 1
h[bar]            #=> nil

为什么最后一行返回nil而不是1

1 个答案:

答案 0 :(得分:1)

eql?必须与返回哈希码的hash方法一起使用:

class Cl
  attr_reader :a
  def initialize(a)
    @a = a
  end
  def eql?(obj)
    @a == obj.a
  end
  def hash
    @a
  end
end

请参阅this blog post