Comment pouvez-vous tester facilement l'égalité de hachage en Ruby lorsque vous ne vous préoccupez des clés d'intersection?
-
19-09-2019 - |
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.
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