0

この問題を新しいコードで再現することはできませんが、非常に一貫して表示されます。

次のデータが与えられます:

[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],
 {}]

時間の2つの配列(、、tおよびtime_range)は、を使用した等価性テストに合格し==ますが、1つのケース(time_range)でのみ値の検索に失敗します。ハッシュコード(http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-5B-5D)を調べてみましたが、まだ困惑しています。

キーを比較するときにRubyのハッシュはどの同等性テストを使用しますか?」によると、ハッシュはeql?キーの同等性を判断するために使用しますが、2つの問題のあるキーは合格しeql?ます。

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

誰かが洞察を提供できますか?今は、assocマッチを利用するようにコードを作り直しますが、このようなことは好きではありません。

4

1 に答える 1

0

それらのリンクに基づいて、両方のオブジェクトのハッシュは同一ですか?

2つの別々のランタイムのキーが==を満たすが、基になるキーのobject_idが異なるためにキーを取得できない、マルチスレッドのJRuby環境で問題が発生しました。これは、同様のクラスの問題である可能性があります-A.eqlを満たす2つのオブジェクトAとB?BがAを満たさないAはB

于 2013-03-25T15:55:22.030 に答える