我正在寻找更好的方法
if hash.key? :a &&
hash.key? :b &&
hash.key? :c &&
hash.key? :d
最好像
hash.includes_keys? [ :a, :b, :c, :d ]
我想出了
hash.keys & [:a, :b, :c, :d] == [:a, :b, :c, :d]
但我不喜欢两次添加数组
答案 0 :(得分:97)
%i[a b c d].all? {|s| hash.key? s}
答案 1 :(得分:19)
([:a, :b, :c, :d] - hash.keys).empty?
或
hash.slice(:a, :b, :c, :d).size == 4
答案 2 :(得分:13)
正是在TIMTOWTDI的精神中,这是另一种方式。如果你require 'set'
(在std lib中)那么你可以这样做:
Set[:a,:b,:c,:d].subset? hash.keys.to_set
答案 3 :(得分:6)
我喜欢这种方式来解决这个问题:
subset = [:a, :b, :c, :d]
subset & hash.keys == subset
快速而清晰。
答案 4 :(得分:6)
您可以通过以下方式获取缺失密钥列表:
expected_keys = [:a, :b, :c, :d]
missing_keys = expected_keys - hash.keys
如果您只想查看是否有任何丢失的密钥:
(expected_keys - hash.keys).empty?
答案 5 :(得分:1)
这是我的解决方法:
class Hash
# doesn't check recursively
def same_keys?(compare)
if compare.class == Hash
if self.size == compare.size
self.keys.all? {|s| compare.key?(s)}
else
return false
end
else
nil
end
end
end
a = c = { a: nil, b: "whatever1", c: 1.14, d: false }
b = { a: "foo", b: "whatever2", c: 2.14, "d": false }
d = { a: "bar", b: "whatever3", c: 3.14, }
puts a.same_keys?(b) # => true
puts a.same_keys?(c) # => true
puts a.same_keys?(d) # => false
puts a.same_keys?(false).inspect # => nil
puts a.same_keys?("jack").inspect # => nil
puts a.same_keys?({}).inspect # => false