2013-04-16 13 views
5

ho gamma rubino ed è nil ma quando controllo utilizzando nil? e blank? restituisce falserubino serie il controllo di gamma a zero

@a = [""] 

@a.nil? 
=> false 

@a.empty? 
=> false 

Come posso controllare per la condizione nil che restituiscono vero?

+2

'[" "]' è _not_ nil. Cosa stai cercando di fare? – Dogbert

+0

Ho la matrice [""] se questa matrice è in arrivo, quindi non dovrebbe andare nella parte interna del blocco. –

+1

Basta fare 'if @a == [" "]'? – Dogbert

risposta

20

[""] è un array con un singolo elemento contenente un oggetto String vuoto. [].empty? restituirà true. @a.nil? restituisce false perché @a è un oggetto Array, non nil.

Esempi:

"".nil? # => false 
[].nil? # => false 
[""].empty? # => false 
[].empty? # => true 
[""].all? {|x| x.nil?} # => false 
[].all? {|x| x.nil?} # => true 
[].all? {|x| x.is_a? Float} # => true 
# An even more Rubyish solution 
[].all? &:nil? # => true 

Quella ultima linea dimostra che [].all? sarà sempre ritorno vero, perché se un array è vuoto, allora, per definizione, tutti i suoi elementi (senza elementi) soddisfano tutte le condizioni.

13

In ruby, è possibile controllare in questo modo

[""].all? {|i| i.nil? or i == ""} 

Se siete su rotaie, si potrebbe fare

[""].all? &:blank? 
1
p defined? "" #=> "expression" 
p defined? nil #=> "nil" 

Quello "" si sta pensando come nil, in realtà un expression . Guardate la dimensione di un array empty e non-empty array come qui sotto per ulteriori prove:

p [].size #=> 0 
p [""].size #=> 1 

Disse il tuo #nil? e #emptyfalse. Quale è previsto.

Problemi correlati