检查散列键是否包含全部键
我正在寻找更好的方法来做
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]
但我不喜欢有两次添加数组
[:a, :b, :c, :d].all? {|s| hash.key? s}
Mori的方式是最好的,但这里有另一种方式:
([:a, :b, :c, :d] - hash.keys).empty?
要么
hash.slice(:a, :b, :c, :d).size == 4
本着TIMTOWTDI的精神,这是另一种方式。 如果你require 'set'
(在标准库中),那么你可以这样做:
Set[:a,:b,:c,:d].subset? hash.keys.to_set
我喜欢这种方式来解决这个问题:
subset = [:a, :b, :c, :d] subset & hash.keys == subset
这是快速和明确的。
您可以通过这种方式获取缺失的密钥列表:
expected_keys = [:a, :b, :c, :d] missing_keys = expected_keys - hash.keys
如果你只是想看看是否有任何遗漏的键:
(expected_keys - hash.keys).empty?