2010-11-27 2 views

ответ

32

Вы можете использовать all?, чтобы проверить, является ли данный предикат истинным для всех элементов перечислимого. Итак:

hash.values.all? {|x| !x.nil?} 

Или

hash.all? {|k,v| !v.nil?} 

Если вы хотите, чтобы проверить, все ключи не являются нулевыми, а также, вы можете изменить, что:

hash.all? {|k,v| !v.nil? && !k.nil?} 
+6

Без блока 'все' автоматически проверяет, если (массив) элементы не являются нулевыми, так проверка значения может быть уменьшена до 'hash.values.all?', а ключи + значения проверяются на 'hash.flatten.all?'! –

+2

@glenn: Не совсем. Он проверяет, что они правдивы. 'false' не' nil', но это также не правдиво. – sepp2k

+0

Если вы на рубине 1.8.7 или новее, или на Rails, вы можете сделать '! hash.values.any? (&: nil?) '. –

2

Enumerable#all? метод делает именно то, что вам нужно.

10

Другой способ:

!hash.values.include? nil 
+4

Кстати, в Rails это еще лучше: 'hash.values.exclude? nil' –

0

Элемент (значение), которое является nil определен. Он определяется как объект nil.

Если Вы желаете, чтобы проверить, есть ли какие-либо клавиши не хватает, то сделайте следующее:

hash = {:key1 => nil, :key2 => 42, :key3 => false} 
keys = [:key1, :key2, :key3] 
all_defined = keys.all?{|key| hash.has_key?(key)} # Returns true 
Смежные вопросы