2009-11-12 38 views
2

说我有以下散列:你怎么能方便地测试在Ruby中的散列平等,当你只关心相交的钥匙?

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类中,可获得更多奖励积分。

回答

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 
+0

这是伟大的,但有一对夫妇的边缘情况下,我想处理,就像如果一个散列是nil,或者为空,或者如果值1等于“1”,或键:乙相匹配的键“b”。在这几天的煨事后,我会用单元测试发布我的解决方案。谢谢! – 2009-11-12 15:00:36

+1

你的奖励积分在哪里?我认为你被扯掉了! :) – tadman 2009-11-12 15:22:50

+1

@Teflon特德:你知道什么是更好的不仅仅是说明你有一定的优势的情况下?张贴他们,以便他们可以提供。你给出的两个例子如果从简单的一行到更复杂的事情。 – Pesto 2009-11-12 15:27:06