Considérez ceci:
class Aaa attr_accessor :a, :b end x = Aaa.new x.a, x.b = 1,2 y = Aaa.new y.a, y.b = 1,2 puts x == y #=>false
4 Réponses :
Aaa = Struct.new(:a, :b) do def c a+b end end Aaa.new(23,42).c #=> 65
Cela semble bien mais j'ai besoin de cette fonctionnalité pour des objets, de toute façon une bonne réponse, je ne connaissais pas les structures
@DFENS: Ce sont des objets. struct.new code> est juste une méthode d'usine pour les cours. Vous obtiendrez exactement le même comportement si vous définissez
aaa code> à l'aide du mot clé code> de classe code>, puis défini
== code> etc.
class Aaa attr_accessor :a, :b def ==(other) return self.a == other.a && self.b == other.b end end x = Aaa.new x.a,x.b = 1,2 y = Aaa.new y.a,y.b = 1,2 y = Aaa.new y.a,y.b = 1,2 z = Aaa.new z.a,z.b = 1,3 x == y # => true x == z # => false
Mais que si je veux faire cela en utilisant d'autres classes? Ou s'il y a 100 attributs?
Dans votre == méthode (autre), vous pourriez faire Self.Instance_Variables.Chaque | Ivar | Self.ivar == Autre.ivar fin, vous voudrez peut-être regarder === aussi.
En utilisant struct code> ou
openstruct code> a ces types de cas intégrés à eux.
La méthode supplémentaire pour faire face à la comparaison d'objets dans Ruby consiste à utiliser hachage code>. Pour la raison de la performance, lorsque la classe est énorme, le meilleur est d'utiliser
hachage code> pour comparer des objets rubis comme suit:
Nous pouvons facilement généraliser à n'importe quel nombre d'instances et supprimer l'exigence de getters pour les variables d'instance: modification alors: p> z code> à: p> < Pré> xxx pré>
Est-ce que cela répond à votre question? y a-t-il un rubis Méthode de détermination si toutes les variables d'instance de deux cas de même classe sont égales?