10
votes

Soustrayez deux hachages en rubis

peut être modifié de la catégorie hachage de sorte que donner deux hachages, un nouveau hachage contenant uniquement des clés présentes dans un hachage, mais pas l'autre peut être créé?

par exemple: > xxx

éventuellement, la méthode différence pourrait inclure des paires de clé / valeur telles que la clé est présente dans les hachages, mais la valeur diffère entre elles.


0 commentaires

5 Réponses :


8
votes

Utilisez la méthode Rejeter code>:

class Hash
  def difference(other)
    reject do |k,v|
      other.has_key?(k) && other[k] == v
    end
  end
end


3 commentaires

HM, je n'avais pas réalisé que la Convention - Doit avoir écrémé cette partie de Eloquent Ruby Un peu trop vite.


Super livre, mais M. Olsen a probablement supposé que les lecteurs connaissaient à ce sujet. Si vous avez aimé ce livre, consultez MetaProgramming Ruby .


Certains lecteurs peuvent avoir pensé rejeter renvoie un tableau, pas un hachage. Il est vrai que énumérable # rejeter renvoie un tableau et la classe hachage inclut le module énumérable , mais hachage a également la méthode hachage # rejeter qui retourne un hash et a la priorité sur l'énumérable Rejeter . Idem pour Sélectionnez . Remarque Il existe des méthodes ROCK # REJECT! et HASH # SELECT! , mais pas de code correspondant ! dans le énumérable module.



2
votes

Vous pouvez le faire:

h2.each_with_object(h1.dup){|(k, v), h| h.delete(k)}


1 commentaires

Le chacun_with_Object. / code> méthode n'a été introduit avant que Ruby 1.9, et je doute que c'est plus rapide que ma suggestion de H1.Reject {| K, V | h2.has_key? k} .



15
votes
(h1.to_a - h2.to_a).to_h
  #=> {"Cat"=>100, "Bird"=>2, "Snake"=>10}

0 commentaires

0
votes

Essayez d'utiliser Gem HashDiff. xxx


1 commentaires

Pourriez-vous fournir quelques détails (et un lien)? De rubydoc.info/gems/hashdiff/0.2.2 , il semble que Cela fait quelque chose un peu différent. Pour une chose, il renvoie une liste de listes, où chaque liste intérieure comporte trois éléments, plutôt qu'un nouveau hachage. En outre, il semble que si h2 contient des éléments non dans h1 , ces éléments seront représentés - ce qui est pas le cas d'un hachage < B> Soustraction opération.



0
votes

Pour la nidification profonde, vous pouvez ajouter un peu de récursivité, quelque chose comme (non testé) xxx


0 commentaires