8
votes

Ruby: Obtenir une liste de propriétés différentes entre les objets

HELO,

Je suis assez nouveau à Ruby (en utilisant 1.8.6) et devez savoir si la fonctionnalité suivante est disponible automatiquement et, sinon, ce qui serait la meilleure méthode pour la mettre en œuvre. P> J'ai une voiture de classe. Et avoir deux objets: p> xxx pré>

est-ce que je pouvais faire un comparateur et trouver quelles propriétés diffèrent dans l'un des objets par rapport à l'autre? P>

Par exemple, P>

{:color => 'Blue', :sun_roof => 'false'}


0 commentaires

4 Réponses :


0
votes

Je ne sais pas si la différence de propriétés est directement possible. Mais le travail autour serait d'essayer le .eql? Opérateur sur les deux objets xxx

S'il y a une différence, vous pouvez utiliser la méthode de la classe d'objet TO_ARRAY comme xxx

comparant maintenant 2 tableaux car la différence serait facile.

non testé mais xxx

ou quelque chose comme ça devrait vous donner la différence de propriétés.

Htth


1 commentaires

Classe # to_a ne fait pas ce que vous voulez du tout. Il renvoie fondamentalement un tableau contenant le récepteur (i.e. string.a_a == [string]).



7
votes

a besoin de quelque peau de peau, mais voici l'idée de base: xxx


1 commentaires

Wow! C'est génial! Je vais essayer! Merci :)



2
votes

Que diriez-vous de

class Object
  def instance_variables_compare(o)
    Hash[*self.instance_variables.map {|v| 
      self.instance_variable_get(v)==o.instance_variable_get(v) ? [] : [v,o.instance_variable_get(v)]}.flatten]
  end
end


>> car_a.instance_variables_compare(car_b)
=> {"@color"=>"Blue", "@sun_roof"=>false}


0 commentaires

0
votes

J'ai eu le même problème et j'étais en train de regarder certaines de vos solutions, mais j'ai pensé que Ruby devait avoir un moyen de résoudre ce problème. J'ai découvert Activemodel :: sale. Fonctionne comme un charme.

http://api.rubyonRails.org/classes/ ActiveModel / Dirty.html # Method i-change


2 commentaires

C'est une chose très différente que ce que l'OP demande cependant.


Je suis d'accord avec Dave Newton. Aussi ActiveModel est un calibre assez lourd pour une réflexion aussi simple ...