7
votes

Comparer des objets en rubis

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 :


9
votes
Aaa = Struct.new(:a, :b) do
  def c
    a+b
  end
end
Aaa.new(23,42).c #=> 65

2 commentaires

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 est juste une méthode d'usine pour les cours. Vous obtiendrez exactement le même comportement si vous définissez aaa à l'aide du mot clé de classe , puis défini == etc.



10
votes
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

3 commentaires

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 ou openstruct a ces types de cas intégrés à eux.



0
votes

La méthode supplémentaire pour faire face à la comparaison d'objets dans Ruby consiste à utiliser hachage . Pour la raison de la performance, lorsque la classe est énorme, le meilleur est d'utiliser hachage pour comparer des objets rubis comme suit: xxx


0 commentaires

2
votes

Nous pouvons facilement généraliser à n'importe quel nombre d'instances et supprimer l'exigence de getters pour les variables d'instance: xxx

modification z à: < Pré> xxx

alors: xxx


0 commentaires