Comment pouvez-vous tester facilement l'égalité de hachage en Ruby lorsque vous ne vous préoccupez des clés d'intersection?

StackOverflow https://stackoverflow.com/questions/1722421

Question

Dire que j'ai les hash suivants:

hash_x = {
  :a => 1,
  :b => 2
}
hash_y = {
  :b => 2,
  :c => 3
}

Je besoin d'un morceau de logique qui compare les deux pour l'égalité en prenant en considération les seules clés entrecroisées.

Dans cet exemple, la touche « b » est le seul point commun entre les deux hash et sa valeur est réglée sur « 2 » à la fois si cette logique ces deux hash seraient considérés comme égaux.

De même ces deux hash ne seraient pas égales en raison de l'inégalité de la « d » clé ( « a » et « c » valeurs clés sont ignorées car elles sont uniques à leurs hash respectifs):

hash_p = {
  :a => 1,
  :b => 2,
  :d => 3,
}
hash_q = {
  :b => 2,
  :c => 3,
  :d => 4
}

Yat-il un malin one-liner en Ruby qui permet de calculer les clés d'intersection des deux hash, puis comparer leurs valeurs pour l'égalité en fonction de ces clés?

Bonus si vous recevez des tests.

plus de points bonus si vous singe-patch dans la classe Hash.

Était-ce utile?

La solution

def compare_intersecting_keys(a, b)
  (a.keys & b.keys).all? {|k| a[k] == b[k]}
end

Utilisez comme ceci:

compare_intersecting_keys(hash_x, hash_y)  # => true
compare_intersecting_keys(hash_p, hash_q)  # => false

Si vous voulez singe-patché:

class Hash
  def compare_intersection(other)
    (self.keys & other.keys).all? {|k| self[k] == other[k]}
  end
end
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top