2009-11-12 4 views
2

Dire que j'ai les hash suivantes:Comment pouvez-vous facilement tester l'égalité de hachage dans Ruby lorsque vous vous souciez uniquement des clés qui se croisent?

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é ne prenant en considération les clés de l'intersection.

Dans cet exemple, la clé 'b' est la seule commune entre les deux hachages et sa valeur est fixée à '2' dans les deux cas, donc par cette logique, ces deux hachages seraient considérés égaux.

De même ces deux hash ne serait pas égale en raison de l'inégalité de la clé « d » (le « a » et « c » des 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 
} 

Existe-t-il un interligne intelligent dans Ruby qui peut calculer les clés d'intersection des deux hachages puis comparer leurs valeurs d'égalité en fonction de ces clés?

Points bonus si vous fournissez des tests.

Plus de points bonus si vous le corrigez en singe dans la classe Hash.

Répondre

9
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 le voulez singe-patché:

class Hash 
    def compare_intersection(other) 
    (self.keys & other.keys).all? {|k| self[k] == other[k]} 
    end 
end 
+0

C'est super, mais il y a un cas de bord de couple que je veux traiter, comme si l'un des les hachés sont nuls ou vides, ou si la valeur 1 est égale à '1', ou la clé: b correspond à la clé 'b'. Je posterai ma solution avec des tests unitaires après ce mijotage pendant quelques jours. Merci! –

+1

Où sont vos points bonus? Je pense que tu t'es fait avoir! :) – tadman

+1

@Teflon Ted: Vous savez quoi de mieux que de simplement dire que vous avez des cas de pointe? Les poster pour qu'ils puissent être fournis. Les deux exemples que vous donnez prennent d'être un simple interlocuteur à quelque chose de plus complexe. – Pesto

Questions connexes