当set键和lookup通过相等测试时,散列查找失败

时间:2013-03-25 15:43:05

标签: ruby hash

我无法在新代码中重现此问题,但它看起来非常一致。

鉴于以下数据:

[47] pry> t
=> [Fri, 01 Mar 2013 00:00:00 +0000, Sun, 24 Mar 2013 23:59:59 +0000]
[48] pry> time_range
=> [Fri, 01 Mar 2013 00:00:00 +0000, Sun, 24 Mar 2013 23:59:59 +0000]
[49] pry> t == time_range
=> true
[52] pry> hsh
=> {[Fri, 01 Mar 2013 00:00:00 +0000, Sun, 24 Mar 2013 23:59:59 +0000]=> {},
 [Fri, 01 Feb 2013 00:00:00 +0000, Thu, 28 Feb 2013 23:59:59 +0000]=> {},
 [Tue, 01 Jan 2013 00:00:00 +0000, Thu, 31 Jan 2013 23:59:59 +0000]=> {}}

这是我在查找时遇到的问题:

[53] pry> hsh[t]
=> {}
[54] pry> hsh[time_range]
=> nil
[55] pry> hsh.assoc(time_range)
=> [[Fri, 01 Mar 2013 00:00:00 +0000, Sun, 24 Mar 2013 23:59:59 +0000],
 {}]

两个数组(ttime_range)通过==进行相等测试,但无法仅在一种情况下查找值(time_range)。我试过调查哈希代码(http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-5B-5D),但仍然感到难过。

根据“Which equality test does Ruby's Hash use when comparing keys?”,哈希使用eql?来确定密钥相等,但两个违规密钥通过eql?

[63] pry> t.eql? time_range
=> true
[64] pry> time_range.eql? t
=> true

有人能提供见解吗?现在我要修改我的代码以利用assoc匹配,但我不喜欢这样做。

1 个答案:

答案 0 :(得分:0)

基于这些链接,两个对象的哈希是否相同?

我们在多线程JRuby环境中遇到了问题,其中两个独立运行时的密钥满足==但由于底层密钥的object_id不同而无法检索密钥。 它可能是一个类似的问题 - 两个对象A和B满足A.eql? B但不满足A是B