2009-11-12 40 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