如何检查散列是否“完全”包含在另一个散列中?

问题描述:

我正在使用Ruby on Rails 3.1.0,我想检查一个散列是否“完全”包含在另一个散列中,并返回布尔值的值。如何检查散列是否“完全”包含在另一个散列中?

说我有那些散列:

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

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

我想检查hash1被包括在hash2即使在hash2有更多的值比hash1(在上述情况下,我的响应我期待应该是true)? 是否有可能通过使用“一个唯一的代码行”“Ruby方法”来做到这一点?我能想到的是

+1

也许你可以将hash1合并到hash2('hash2.merge(hash1)'),看看它是否改变。这是一种非常幼稚的做法,但如果它是你想要的一行代码,那可能是最简单的方法。 – 2011-09-28 14:37:46

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

不错。这就是为什么我在我的答案中加入了“我能想到的”部分;-) –

+0

太棒了!我只花了一个小时玩**收集** **包括** ** values_at **和朋友......没有合理的结果。终于打这个答案。很简单。 – Kocur4d

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 

最简单的方法:这将是足够的

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

我不知道我的理解中的散列列入想法。 看看它是否有相同的键(通常的问题)。 在HASH1所有按键都包含在HASH2: hash1.keys - hash2.keys == []

然后,如果你要比较这些值做的建议在以前的帖子: hash1.values - hash2.values_at (* hash1.keys)== []

更优雅的方法是在一个散列合并另一个时检查相等性。

例如重写哈希包括?实例方法。

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

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