我正在使用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方法”来做到这一点?
那就足够了
(hash1.to_a - hash2.to_a).empty?
我能想到的最简单的方法是:
hash2.values_at(*hash1.keys) == hash1.values
更优雅的方法是在一个哈希合并另一个哈希时检查相等性。
例如重写哈希包括?实例方法。
class Hash
def include?(other)
self.merge(other) == self
end
end
{:a => 1, :b => 2, :c => 3}.include? :a => 1, :b => 2 # => true
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
我不确定我是否理解哈希中的包含思想。查看它是否具有相同的键(通常的问题)。 hash1中的所有键都包含在hash2中:hash1.keys - hash2.keys == []
然后,如果你想比较这些值,请按照上一篇文章中的建议进行比较:hash1.values - hash2.values_at(* hash1.keys)== []
我找到的最有效和最优雅的解决方案 - 没有中间数组或冗余循环。
class Hash
alias_method :include_key?, :include?
def include?(other)
return include_key?(other) unless other.is_a?(Hash)
other.all? do |key, value|
self[key] == value
end
end
end
从Ruby 2.3开始,您可以使用内置的Hash#<=
方法。