2014-06-23 1 views
1

Si je place des valeurs nil dans un tableau, je ne semble pas pouvoir les vérifier. J'ai essayé any? et empty?.Comment vérifier si un ensemble est nul ou non?

array = [nil, nil, nil] 
#=> [nil, nil, nil] 

array[1].any? 
#=> "NoMethodError: undefined method `any?' for nil:NilClass" 

Répondre

3

any? effectue une itération sur un conteneur, comme un tableau, et examine chaque élément qui lui est transmis pour voir s'il a réussi un test. Si l'on fait, la boucle s'arrête et true est retourné:

ary = [nil, 1] 

ary.any?{ |e| e.nil? } # => true 

The documentation explique bien:

Passes each element of the collection to the given block. The method returns true if the block ever returns a value other than false or nil. If the block is not given, Ruby adds an implicit block of { |obj| obj } that will cause any? to return true if at least one of the collection members is not false or nil.

%w[ant bear cat].any? { |word| word.length >= 3 } #=> true 
%w[ant bear cat].any? { |word| word.length >= 4 } #=> true 
[nil, true, 99].any?        #=> true 

any? est l'un d'un certain nombre de tests qui peuvent être appliquées à un tableau de déterminer s'il y a none?, any?, one? ou all?.

ary.one?{ |e| e == 1 } # => true 
ary.none?{ |e| e == 2 } # => true 
ary.all? { |e| e.nil? } # => false 

Votre code échoue parce que vous essayez d'utiliser une méthode any? non existante pour une valeur nulle, d'où l'erreur que vous avez: « NoMethodError: méthode non définie tout » pour néant: NilClass "

ary[0] # => nil 
ary.first # => nil 
ary.first.respond_to?(:'any?') # => false 

Vous devez faire attention à ce que vous faites. ary[0] ou array.first renvoie l'élément à cet index de tableau, pas un tableau.

empty? vérifie uniquement si le conteneur contient des éléments. En d'autres termes, a-t-il une taille> 0?

ary.empty? # => false 
ary.size == 0 # => false 
ary.size > 0 # => true 
[].empty? # => true 
[].size == 0 # => true 
[].size > 0 # => false 
2
array = [nil, nil, nil] 
#=> [nil, nil, nil] 
array[1].nil? 
#=> true 
2

Vous pouvez transformer les valeurs nulles en booléens cette façon de vérifier les

array = [nil, nil, nil] 
#=> [nil, nil, nil] 
!array[1] 
#=> true 
!!array[1] 
#=>false 

Cependant, en utilisant tout? vérifie l'existence de quelque chose. Vous pouvez utiliser

array.any? {|item| !item } 
#=> true 

Pour vérifier s'il y a des valeurs qui évaluent à false en tant que valeur nil fait. Soyez prudent si vous avez une valeur false dans votre tableau, car elle sera également évaluée comme true en utilisant cette méthode.

Ou vous pouvez simplement utiliser:

array.any? { |item| item.nil? } 

Comme d'autres l'ont suggéré

Votre problème est que vous appelez la méthode any? sur nulle et non sur un tableau.

+0

Les chiffres ne concerne que les 'nil', pas' nil' ou 'false'. –

+0

Vous avez raison, c'est pourquoi j'ai aussi ajouté le bit à propos de zéro: – onetwopunch

1
# check if there are any truthy values in the array 
[nil, nil, nil].any? #=> false 
[nil, true, nil].any? #=> true 

# check if all values are truthy 
[true,Duck.new,2,'yes'].all? #=> true 
[nil, false].all? #=> false 

# check if none values are truthy 
[nil,false,nil].none? #=> true 
[Math::PI,nil,false].none? #=> false 

Toutes ces méthodes acceptent un bloc facultatif pour l'évaluation booléenne.

+0

Les nombres ne concernent que «nil», pas «nil» ou «false». –

4

Si vous voulez vérifier si le tableau comprend nil:

[nil, 1, 2].include?(nil) #=> true 
Questions connexes