28 votes

Comment faire de l'instance d'un objet une clé de hachage en Ruby ?

J'ai une classe Foo avec quelques variables membres. Lorsque toutes les valeurs de deux instances de la classe sont égales, je veux que les objets soient "égaux". J'aimerais alors que ces objets soient des clés dans mon hachage. Lorsque j'essaie actuellement de le faire, le hachage traite chaque instance comme étant inégale.

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

f1 et f2 doivent être égaux à ce stade.

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

devrait imprimer 8

50voto

Mark Points 3491

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

Hash utilise key.eql ? pour tester l'égalité des clés. l'égalité. Si vous avez besoin d'utiliser des instances de vos propres classes comme clés dans un Hash, il est recommandé de définir à la fois les méthodes eql ? et hash. La méthode hash doit avoir la propriété suivante a.eql ?(b) implique a.hash == b.hash.

La méthode eql ? est facile à mettre en œuvre : retournez vrai si toutes les variables membres sont identiques. Pour la méthode hash, utilisez [@data1, @data2].hash comme le suggère Marc-André dans les commentaires.

-1voto

Sniggerfardimungus Points 5207

Ajoutez une méthode appelée "hash" à votre classe :

class Foo
  def hash
    return whatever_munge_of_instance_variables_you_like
  end
end

Cela fonctionnera comme vous l'avez demandé et ne générera pas de clés de hachage différentes pour des objets différents, mais identiques.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X