【发布时间】:2015-04-19 11:03:35
【问题描述】:
我正在使用 Ruby 2.2.1 并且有以下情况:
a = ... # some object
h = ... # some hash
p h.size #=> 1
p h.keys.first.hash == a.hash #=> true
p h.keys.first.eql?(a) #=> true
p h.has_key?(a) #=> false
这怎么可能?我认为哈希匹配和 eql? 返回 true 是键被视为相等的唯一条件。
编辑:这是完整的程序。但请注意,我不是在问如何解决它——我知道如何解决。 我在问为什么 Ruby 会这样!因为我很困惑为什么
Hash 的 API 合同在这种情况下毫无意义。
class A
attr_reader :x
def initialize(x)
@x = x
end
MY_HASH = { A.new(5) => 'foo' }
def ==(other)
@x == other.x
end
alias_method :eql?, :==
def hash
@x
end
end
a = A.new(5)
h = A::MY_HASH
p h.size #=> 1
p h.keys.first.hash == a.hash #=> true
p h.keys.first.eql?(a) #=> true
p h.has_key?(a) #=> false
【问题讨论】:
-
你能发布这样行为的对象吗?