2010-11-27 9 views

Respuesta

32

Puede usar all? para verificar si un predicado determinado es verdadero para todos los elementos en un enumerable. Por lo tanto:

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

O

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

Si también desea comprobar, todas las claves no son nulas, así, se puede modificar eso para:

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

Sin un bloque 'todo 'comprueba automáticamente si los (array) elementos no son nulas, por lo que la la comprobación del valor se puede reducir a 'hash.values.all?', y las claves + valores se comprueban a 'hash.flatten.all?'! –

+2

@glenn: No del todo. Verifica que sean verdad. 'false' no es' nil', pero tampoco es verdad. – sepp2k

+0

Si estás en ruby ​​1.8.7 o posterior, o en Rails, ¡podrías hacer '! hash.values.any? (&: nil?) '. –

2

Enumerable#all? método hace exactamente lo que necesitas

10

Otra forma:

!hash.values.include? nil 
+4

Por cierto, en Rails es aún mejor: 'hash.values.exclude? nil' –

0

Un elemento (valor) que es nil se define. Se define como el objeto nil.

Si tienes intención de comprobar si hay alguna llaves encuentra, entonces hacer lo siguiente:?

hash = {:key1 => nil, :key2 => 42, :key3 => false} 
keys = [:key1, :key2, :key3] 
all_defined = keys.all?{|key| hash.has_key?(key)} # Returns true 
Cuestiones relacionadas