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

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

Вопрос

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

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.

Это было полезно?

Решение

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top