Как вы можете легко проверить равенство хэшей в Ruby, если вас интересуют только пересекающиеся ключи?
-
19-09-2019 - |
Вопрос
Скажем, у меня есть следующие хеши:
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