2011-09-28 12 views
18

Używam Ruby on Rails 3.1.0 i chciałbym sprawdzić, czy mieszania jest "całkowicie" zawarte w innym hash i zwracają wartość boolean.Jak sprawdzić, czy skrót jest "całkowicie" zawarty w innym haszowaniu?

Say mam te hashe:

hash1 = { 
    :key1 => 'value1', 
    :key2 => 'value2', 
    :key3 => 'value3' 
} 

hash2 = { 
    :key1 => 'value1', 
    :key2 => 'value2', 
    :key3 => 'value3', 
    :key4 => 'value4', 
    :key5 => 'value5', 
    ... 
} 

Chciałbym sprawdzić czy hash1 jest wliczone w hash2 nawet jeśli w hash2 istnieje więcej wartości niż hash1 (w powyższym przypadku odpowiedź, że Szukam powinien być true)? Czy można to zrobić, używając "tylko jednej linii kodu" \ "metody Ruby"?

+1

Być może można połączyć hash1 w hash2 ('hash2.merge (hash1)') i sprawdzić, czy się zmienił. To bardzo naiwny sposób robienia tego, ale jeśli jest to jedna linia kodu, którą chcesz, to prawdopodobnie najprostszy sposób. –

Odpowiedz

33

To będzie wystarczająco

(hash1.to_a - hash2.to_a).empty? 
+0

Nice. Dlatego dodałem część "Mogę wymyślić" do mojej odpowiedzi ;-) –

+0

Świetne! Właśnie spędziłem godzinę bawiąc się ** zbierać ** ** dołączać? ​​** ** values_at ** i przyjaciele ... bez rozsądnego wyniku. Aby w końcu trafić w tę odpowiedź. Tak prosty. – Kocur4d

2
class Hash 
    def included_in?(another) 
    # another has to have all my keys... 
    return false unless (keys - another.keys).empty? 
    # ..and have the same value for every my key 
    each do |k,v| 
     return false unless v == another[k] 
    end 
    true 
    end 
end 

hash1.included_in?(hash2) # => true 
hash2.included_in?(hash1) # => false 
3

Najłatwiej można myślę, byłoby:

hash2.values_at(*hash1.keys) == hash1.values 
0

Nie jestem pewien, czy rozumiem ideę integracji w hash. Aby sprawdzić, czy ma te same klucze (zwykły problem). Wszystkie klucze w hash1 są zawarte w hash2: hash1.keys - hash2.keys == []

Następnie, jeśli chcesz porównać te wartości robić jak zasugerowano w poprzednim poście: hash1.values ​​- hash2.values_at (* hash1.keys) == []

3

bardziej eleganckim sposobem jest sprawdzenie równości, gdy jeden hash łączy inny.

np. przepisać Hash to? metoda instancji dla tego.

class Hash 
    def include?(other) 
    self.merge(other) == self 
    end 
end 

{:a => 1, :b => 2, :c => 3}.include? :a => 1, :b => 2 # => true 
Powiązane problemy