Как вы можете легко проверить равенство хешей в Ruby, если вам нужны только пересекающиеся ключи? - PullRequest
2 голосов
/ 12 ноября 2009

Скажем, у меня есть следующие хэши:

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

Мне нужен кусок логики, который сравнивает их на равенство только с учетом пересекающихся ключей.

В этом примере клавиша 'b' является единственной общностью между двумя хэшами, и ее значение установлено равным '2' в обоих, поэтому по этой логике эти два хэша будут считаться равными.

Аналогично, эти два хэша не будут равны из-за неравенства клавиши 'd' (значения клавиш 'a' и 'c' игнорируются, поскольку они уникальны для своих соответствующих хэшей):

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

Есть ли в Ruby умный однострочник, который может вычислить пересекающиеся ключи двух хешей, а затем сравнить их значения на равенство на основе этих ключей?

Бонусные баллы, если вы предоставляете тесты.

Больше бонусных очков, если вы обезьяны-патч в класс Hash.

1 Ответ

9 голосов
/ 12 ноября 2009
def compare_intersecting_keys(a, b)
  (a.keys & b.keys).all? {|k| a[k] == b[k]}
end

Используйте вот так:

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

Если вы хотите его залатать обезьяной:

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