Come è possibile verificare facilmente l'uguaglianza hash in Ruby quando vi interessa soltanto che si intersecano chiavi?

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

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.

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top