Подтвердить что ты не робот

Проверьте, содержат ли хеш-ключи весь набор ключей

Я ищу лучший способ сделать

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]

но мне не нравится добавлять массив дважды, хотя

4b9b3361

Ответ 1

[:a, :b, :c, :d].all? {|s| hash.key? s}

Ответ 2

@Мори лучше всего, но здесь по-другому:

([:a, :b, :c, :d] - hash.keys).empty?

или

hash.slice(:a, :b, :c, :d).size == 4

Ответ 3

Просто в духе TIMTOWTDI, здесь по-другому. Если вы require 'set' (в std lib), вы можете сделать это:

Set[:a,:b,:c,:d].subset? hash.keys.to_set

Ответ 4

Мне нравится этот способ решить эту проблему:

subset = [:a, :b, :c, :d]
subset & hash.keys == subset

Это быстро и понятно.

Ответ 5

Вы можете получить список отсутствующих ключей таким образом:

expected_keys = [:a, :b, :c, :d]
missing_keys = expected_keys - hash.keys

Если вы просто хотите увидеть, есть ли отсутствующие ключи:

(expected_keys - hash.keys).empty?