2009-11-12 3 views
2

나는 다음과 같은 해시를 가지고 말 :교차하는 키에만 관심이있을 때 Ruby에서 해시 동등성을 쉽게 테스트 할 수 있습니까?

hash_x = { 
    :a => 1, 
    :b => 2 
} 
hash_y = { 
    :b => 2, 
    :c => 3 
} 

내가 어떤지 두 만 고려 교차 키를 고려하여 비교 논리의 덩어리가 필요합니다.

이 예제에서 'b'키는 두 해시 간의 유일한 공통점이며 두 값 모두 '2'로 설정되어 있기 때문에 두 해시가 동일한 것으로 간주됩니다. (그들 각각의 해시 고유 때문에 무시되는 'A'와 'C'키 값)

마찬가지로 두 해시 인해 'D'키의 불평등 같지 않을 것이다 :

hash_p = { 
    :a => 1, 
    :b => 2, 
    :d => 3, 
} 
hash_q = { 
    :b => 2, 
    :c => 3, 
    :d => 4 
} 

Ruby에는 두 해시의 교차 키를 계산할 수있는 영리한 한 줄 짜기가 있습니까? 그런 다음이 값을 키에 따라 동일하게 비교하십시오.

테스트를 제공하는 경우 보너스 포인트.

해시 클래스에 원숭이 패치를 추가하면 보너스 포인트가 추가됩니다. 이 같은

답변

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가 키 'b'와 일치하는 경우 며칠 동안이 시험을 치른 후에 단위 테스트로 솔루션을 게시 할 것입니다. 감사! –

+1

보너스 포인트는 어디 있습니까? 나는 당신이 찢어 버린 것 같아요! :) – tadman

+1

@ 테플론 테드 : 당신은 어떤 엣지 케이스가 있다고 말하는 것보다 낫지? 게시 할 수 있도록 게시하십시오. 간단한 한 줄짜리에서 더 복잡한 것에 이르기까지 당신이주는 두 가지 예가 있습니다. – Pesto