Come è possibile verificare facilmente l'uguaglianza hash in Ruby quando vi interessa soltanto che si intersecano chiavi?
-
19-09-2019 - |
Domanda
Dire che ho le seguenti hash:
hash_x = {
:a => 1,
:b => 2
}
hash_y = {
:b => 2,
:c => 3
}
Ho bisogno di un pezzo di logica che confronta i due per l'uguaglianza solo prendendo in considerazione i tasti che si intersecano.
In questo esempio il tasto 'b' è l'unica comunanza tra i due hash e il suo valore viene impostato su '2' in entrambi così da tale logica i due hash verrebbero considerati uguali.
Analogamente i due hash non sarebbe pari a causa della disuguaglianza della chiave 'd' (la 'a' e 'c' valori di chiave vengono ignorate poiché sono unici alle rispettive hash):
hash_p = {
:a => 1,
:b => 2,
:d => 3,
}
hash_q = {
:b => 2,
:c => 3,
:d => 4
}
C'è un intelligente one-liner in Ruby che può calcolare le chiavi intersecano dei due hash quindi confrontare i loro valori di uguaglianza sulla base di quelle chiavi?
punti bonus se forniti i test.
Più punti bonus se si scimmia-patch in classe Hash.
Soluzione
def compare_intersecting_keys(a, b)
(a.keys & b.keys).all? {|k| a[k] == b[k]}
end
Utilizzare questo modo:
compare_intersecting_keys(hash_x, hash_y) # => true
compare_intersecting_keys(hash_p, hash_q) # => false
Se si vuole che la scimmia-patch:
class Hash
def compare_intersection(other)
(self.keys & other.keys).all? {|k| self[k] == other[k]}
end
end