2013-04-16 9 views
5

mam rubinowy tablicę i jest nil ale kiedy sprawdzasz za pomocą nil? i blank? zwraca falserubin tablica sprawdzanie zera tablicy

@a = [""] 

@a.nil? 
=> false 

@a.empty? 
=> false 

Jak mogę sprawdzić, czy nil warunkiem, że zwróci true?

+2

'[" "]' to _nie_ zero. Co próbujesz zrobić? – Dogbert

+0

Otrzymuję tablicę [""], jeśli nadchodzi ta tablica, nie powinna ona iść do wewnętrznej części bloku. –

+1

Po prostu wykonaj 'if @ a == [" "]'? – Dogbert

Odpowiedz

20

[""] to tablica z pojedynczym elementem zawierającym pusty obiekt String. [].empty? zwróci true. @a.nil? powraca false, ponieważ @a jest obiektem Array, a nie nil.

Przykłady:

"".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 

Ta ostatnia linia pokazuje, że [].all? będzie zawsze powrót prawda, bo jeśli tablica jest pusta wtedy z definicji wszystkie jego elementy (bez elementów) spełniają każdych warunkach.

13

W Ruby, można sprawdzić jak to

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

Jeśli jesteś na szynach, można zrobić

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

Ten "" myślisz jak nil, faktycznie expression . Spójrz na rozmiaru empty tablicy i non-empty tablicy jak poniżej, aby uzyskać więcej dowodów:

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

Powiedział swój #nil? i #empty daje false. Który jest oczekiwany.