peut être modifié de la catégorie code> hachage de code> 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: P> > éventuellement, la méthode différence code> pourrait inclure des paires de clé / valeur telles que la clé est présente dans les hachages, mais la valeur diffère entre elles. P > p>
5 Réponses :
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
HM, je n'avais pas réalisé que la Convention - Doit avoir écrémé cette partie de Eloquent Ruby I> 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 a>.
Certains lecteurs peuvent avoir pensé rejeter code> renvoie un tableau, pas un hachage. Il est vrai que énumérable # rejeter a > renvoie un tableau et la classe hachage code> inclut le module énumérable code>, mais hachage code> a également la méthode hachage # rejeter qui retourne un hash et a la priorité sur l'énumérable Rejeter code>. Idem pour Sélectionnez CODE>. Remarque Il existe des méthodes ROCK # REJECT! CODE> et HASH # SELECT! CODE>, mais pas de code correspondant ! Code> dans le énumérable code> module.
Vous pouvez le faire:
h2.each_with_object(h1.dup){|(k, v), h| h.delete(k)}
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} code>.
(h1.to_a - h2.to_a).to_h
#=> {"Cat"=>100, "Bird"=>2, "Snake"=>10}
Essayez d'utiliser Gem HashDiff.
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 code> contient des éléments non dans h1 code>, ces éléments seront représentés - ce qui est pas b> le cas d'un hachage < B> Soustraction B> opération.
Pour la nidification profonde, vous pouvez ajouter un peu de récursivité, quelque chose comme (non testé)