web-dev-qa-db-ja.com

Rubyでオブジェクトインスタンスをハッシュキーにする方法は?

いくつかのメンバー変数を持つクラスFooがあります。クラスの2つのインスタンスのすべての値が等しい場合、オブジェクトを「等しい」にします。次に、これらのオブジェクトをハッシュのキーにします。私が現在これを試しているとき、ハッシュは各インスタンスを等しくないものとして扱います。

h = {}
f1 = Foo.new(a,b)
f2 = Foo.new(a,b)

この時点で、f1とf2は等しくなければなりません。

h[f1] = 7
h[f2] = 8
puts h[f1]

8を印刷する必要があります

34
Poul

http://Ruby-doc.org/core/classes/Hash.html を参照してください

ハッシュはkey.eqlを使用しますか?キーが等しいかどうかをテストします。独自のクラスのインスタンスをハッシュのキーとして使用する必要がある場合は、両方のeql?を定義することをお勧めします。およびハッシュメソッド。ハッシュメソッドには、a.eql?(b)がa.hash == b.hashを意味するというプロパティが必要です。

Eql?メソッドの実装は簡単です。すべてのメンバー変数が同じ場合はtrueを返します。ハッシュメソッドについては、Marc-Andreがコメントで示唆しているように、[@ data1、@ data2] .hashを使用してください。

58
Mark