Ответ 1
[:a, :b, :c, :d].all? {|s| hash.key? s}
Я ищу лучший способ сделать
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}
@Мори лучше всего, но здесь по-другому:
([:a, :b, :c, :d] - hash.keys).empty?
или
hash.slice(:a, :b, :c, :d).size == 4
Просто в духе TIMTOWTDI, здесь по-другому. Если вы require 'set'
(в std lib), вы можете сделать это:
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?