Ruby hash: вернуть первое значение ключа, под которым не ноль - PullRequest
0 голосов
/ 05 мая 2018

Скажи, что у меня есть хэш

hash = {a:1, b:false, c:nil}

& серия ключей где-то: [:c, :b, :a]. Существует ли идиома Ruby для возврата значения ключа, при котором! = Nil?

Обь

[:c, :b, :a].select {|key| hash[key] != nil}.first     # returns :b

кажется слишком длинным.

Ответы [ 3 ]

0 голосов
/ 05 мая 2018

Если вы хотите отфильтровать элементы с ложными значениями, вы можете использовать следующие выражения.

keys = [:d, :c, :b, :a]
hash = { a: 1, b: nil, c: nil, d: 2 }
keys.select(&hash)
#  => [:d, :a]

Если вы хотите фильтровать элементы с нулевым значением, это не правильно, как писал господин Илья.

0 голосов
/ 05 мая 2018

Вы можете использовать detect, это вернет первое значение, если совпадение. [:c, :b, :a].detect { |key| hash[key] != nill }. Это вернется: б. Надеюсь помочь вам: D

0 голосов
/ 05 мая 2018

Для этого я думаю Enumerable#find может работать:

find(ifnone = nil) { |obj| block } → obj or nil
find(ifnone = nil) → an_enumerator

Пропускает каждую запись в enum для блокировки. Возвращает первый для которого блок не ложь Если ни один объект не соответствует, вызывает ifnone и возвращает его результат, если он указан, или возвращает nil в противном случае.

Если блок не указан, вместо него возвращается перечислитель.

В вашем случае он вернул бы первый, для которого блок не nil:

p %i[c b a].find { |key| !{ a: 1, b: nil, c: nil }[key].nil? } # :a
p %i[c b a].find { |key| !{ a: 1, b: 1, c: nil }[key].nil? }   # :b
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...