2011-09-28 12 views
18

मैं रूबी 3.1.0 पर रूबी का उपयोग कर रहा हूं और मैं यह जांचना चाहता हूं कि हैश एक अन्य हैश में "पूरी तरह से" शामिल है या बूलियन मान लौटाता है।यह जांचने के लिए कि क्या हैश किसी अन्य हैश में "पूरी तरह से" शामिल है या नहीं?

मैं उन हैश है कहते हैं:

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

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

मैं अगर hash1hash2 में शामिल है प्रतिक्रिया है कि मैं जाँच करने के लिए भले ही hash2 में वहाँ hash1 से अधिक मान रहे हैं (उपरोक्त मामले में चाहते हैं क्या true होना चाहिए)? क्या यह एक ही कोड कोड \ "एक रूबी विधि" का उपयोग कर करना संभव है?

+1

शायद आप हैश 1 को हैश 2 ('हैश 2.मेरगे (हैश 1) 'में विलय कर सकते हैं और देख सकते हैं कि यह बदल गया है या नहीं। यह करने का यह एक बहुत ही बेवकूफ तरीका है, लेकिन यदि यह कोड की एक पंक्ति है जिसे आप चाहते हैं, तो यह शायद सबसे आसान तरीका है। –

उत्तर

33

पर्याप्त होगी कि

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

अच्छा। यही कारण है कि मैंने अपने जवाब में "मैं सोच सकता हूं" भाग जोड़ा ;-) –

+0

शानदार! मैंने ** एक ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** अंत में इस जवाब को हिट करने के लिए। बहुत आसन। – 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

सबसे आसान तरीका मैं होगा के बारे में सोच सकते हैं:

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

मुझे यकीन है कि अगर मैं हैश में शामिल करने के विचार को समझ में नहीं कर रहा हूँ। यह देखने के लिए कि क्या उसके पास एक ही कुंजी (सामान्य समस्या) है। hash1 के सभी चाबियाँ hash2 में शामिल हैं: hash1.keys - hash2.keys == []

तो अगर आप की तुलना करने के रूप में पिछले पोस्ट में सुझाव दिया उन मूल्यों करना चाहते हैं: hash1.values ​​- hash2.values_at (* हैश 1.कीएस) == []

3

एक हैश एक दूसरे को विलय करते समय समानता की जांच करने का अधिक सुरुचिपूर्ण तरीका है।

उदा। हैश को फिर से लिखना शामिल है? इसके लिए उदाहरण विधि।

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

{:a => 1, :b => 2, :c => 3}.include? :a => 1, :b => 2 # => true 
संबंधित मुद्दे