2011-09-28 13 views
18

Rails 3.1.0 Ruby on kullanıyorum ve bir karma "tamamen" Başka karma yer alıp almadığını kontrol edin ve bir boolean değer döndürmek istiyorum. Bir karma başka bir hash "dahil" olup olmadığını nasıl kontrol edilir?

O karmaları olduğunu varsayalım:

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

hash2 = { 
    :key1 => 'value1', 
    :key2 => 'value2', 
    :key3 => 'value3', 
    :key4 => 'value4', 
    :key5 => 'value5', 
    ... 
} 
ben hash1 hash2 yer alıp almadığını yukarıdaki örnekte, ( hash2 fazla değerler hash1 den olsa bile ki ben tepkisini kontrol etmek istiyorum

arıyorum true olmalı? , "sadece bir kod satırı" \ "bir Ruby yöntemi" kullanarak yapılabilir mi? Ben olacağını düşünebiliriz

+1

Belki hash1'i hash2 ('hash2.merge (hash1)') ile birleştirebilir ve değişip değişmediğini görebilirsiniz. Bunu yapmanın çok naif bir yolu, ama eğer istediğiniz bir kod satırıysa, muhtemelen en basit yoldur. –

cevap

33

yeterli olacaktır

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

Güzel. Bu yüzden cevabımı "düşünebiliyorum" kısmını ekledim ;-) –

+0

Brilliant! Ben sadece ** topla ** bir saat geçirdim ** ** dahil ** ** değerler_at ** ve arkadaşlar ... makul bir sonuç olmadan. Sonunda bu cevabı vurmak için. Çok basit. – 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

kolay yolu:

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

Ben karma dahil fikri anlamak emin değilim. Aynı tuşlara sahip olup olmadığını görmek için (normal problem). HASH1 içinde Tüm anahtarlar HASH2 dahildir: hash1.keys - hash2.keys == [] Sonra önceki sonrası önerildiği gibi bu değerler yapmak karşılaştırmak istiyorsanız

: hash1.values ​​- hash2.values_at (* hash1.keys) == []

3

daha şık bir şekilde, bir karma bir birleştirme eşitliği kontrol etmektir.

örn. Hash yeniden yazmak? Bunun için örnek yöntem.

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

{:a => 1, :b => 2, :c => 3}.include? :a => 1, :b => 2 # => true 
İlgili konular