检查散列键是否包含全部键

我正在寻找更好的方法来做

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?