当你只关心交叉键时,如何在Ruby中轻松测试哈希相等?

时间:2009-11-12 14:06:42

标签: ruby hash comparison intersection equality

说我有以下哈希:

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 个答案:

答案 0 :(得分:9)

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