Ruby 是如何判断 hash 中的 key 是同一个

对于两个键 key1、key2, 当 key1.hash 与 key2.hash 得到的整数值相同,且 key1.eql?(key2) 为 true 时,就会认为这两个键是一致的。

class User
  attr_reader :name

  def initialize(name)
    @name = name
  end

  def hash
    @name.hash
  end

  def ==(o)
    o.name == self.name
  end
  alias_method :eql?, :==
end

u1 = User.new("Joe")
u2 = User.new("Joe")

m = { u1 => 1 }

m.merge!(u2 => 2)

p m # => {#<User:0x00007fe10b18d640 @name="Joe">=>2}