2010-02-24 7 views
30

Ich habe eine Klasse Foo mit ein paar Membervariablen. Wenn alle Werte in zwei Instanzen der Klasse gleich sind, möchte ich, dass die Objekte 'gleich' sind. Ich möchte dann, dass diese Objekte Schlüssel in meinem Hash sind. Wenn ich dies derzeit versuche, behandelt der Hash jede Instanz als ungleich.Wie wird Objektinstanz in Ruby zu einem Hash-Schlüssel gemacht?

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

f1 und f2 sollten an dieser Stelle gleich sein.

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

sollte drucken 8

Antwort

54

Siehe http://ruby-doc.org/core/classes/Hash.html

Hash verwendet key.eql? Tasten für Gleichheit zu testen. Wenn Sie Instanzen müssen in einem Hash Ihrer eigenen Klassen als Schlüssel verwenden, wird empfohlen, dass Sie beide die eql definieren? und Hash-Methoden. Der Hash- Methode muss die Eigenschaft haben, die a.eql? (B) a.hash == b.hash impliziert.

Die eql? Methode ist einfach zu implementieren: true zurückgeben, wenn alle Mitgliedsvariablen identisch sind. Verwenden Sie für die Hash-Methode [@ data1, @ data2] .hash, wie Marc-Andre in den Kommentaren vorschlägt.

+0

Perfekte Erklärung. =) – Mereghost

+8

Gut, außer dass der zurückgegebene Hash eine fixnum sein sollte, also verwende lieber exclusive oder anstelle von sum (was zu einem bignum überlaufen könnte). Alternativ verwenden Sie 'Array # hash', wie' [@ data1, @ data2] .hash', sagen wir. –

+0

Guter Punkt. Das Hinzufügen von einzelnen Hashes birgt auch die Gefahr, dass aus verschiedenen einzelnen Hashes die gleiche Summe entsteht (3 + 2 = 5 und 1 + 4 = 5). Die Verwendung von Array # Hash, wie es Marc-Andre vorschlägt, würde die Lösung vervollständigen. – Mark

-3

eine Methode Add ‚hash‘ zu Ihrer Klasse genannt:

class Foo 
    def hash 
    return whatever_munge_of_instance_variables_you_like 
    end 
end 

Dies wird die Art und Weise arbeiten Sie angefordert und nicht verschiedenen Hash-Schlüssel für unterschiedliche, aber gleich, Objekte erzeugt.

+4

Sie sollten auch die eql? Methode in einer Art und Weise definieren, die mit dem Hash-Verfahren konsistent ist. außerdem muss der Hash-Methode ein Fixnum zurückzukehren, oder es wird brechen uniq. – ChrisPhoenix

Verwandte Themen