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

Определить, содержит ли хэш любой ключ из набора ключей?

Знаете ли вы довольно рубиновый способ узнать, имеет ли хэш один из ключей?

h = {:a => 1, :c => 3, :d => 4}
# keys to find are :a, :b or :e

Я знаю, что могу сделать:

h.key?(:a) || h.key?(:b) || h.key?(:e)

Но мне было интересно, есть ли более красивый способ сделать это!:)

Спасибо большое!

4b9b3361

Ответ 1

Рассмотрим Enumerable.any?

[:a, :b, :e].any? {|k| h.key?(k)}

Из IRB:

>> h = {:a => 1}; [:x].any? {|k| h.key?(k)}                    
=> false                                                                
>> h = {:a => 1}; [:x, :a].any? {|k| h.key?(k)}                
=> true

Счастливое кодирование.

Ответ 2

Вот как вы получаете все соответствующие ключи из массива:

> {:a => 1, :c => 3, :d => 4}.keys & [:a, :d, :e]
 => [:a, :d] 

и если вы хотите логическое (следующее предложение Andrew):

> ({:a => 1, :c => 3, :d => 4}.keys & [:a, :d, :e]).empty?
 => false 
> ({:a => 1, :c => 3, :d => 4}.keys & [:f, :e]).empty?
 => true 

Ответ 3

Я бы сделал что-то вроде этого:

[:a, :b, :e].any?{ |val| h.key?(val) } 

Ответ 4

h.select{|k| [:b, :w, :e].include?(k) }.empty?
h.select{|k| [:a, :w, :e].include?(k) }.empty?

И вы получаете хеш (ключ и значение) совпадающего ключа в возврате (без пустого?)