如何检查数组中是否设置了nil?

如果我将一些nil值设置为数组,我似乎无法检查它们。 我试过了any? empty?

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

any? 迭代容器,如数组,并查看传递给它的每个元素,看它是否通过测试。 如果有,则循环停止并返回true

 ary = [nil, 1] ary.any?{ |e| e.nil? } # => true 

文档很好地解释了这一点:

将集合的每个元素传递给给定的块。 如果块返回false或nil以外的值,则该方法返回true。 如果没有给出块,Ruby会添加一个{| obj |的隐式块 obj}会导致什么? 如果至少有一个集合成员不是false或nil,则返回true。

 %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? 是可以应用于数组以确定是否none?的多个测试之一none?any?one? 还是all?

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

您的代码失败是因为您尝试使用不存在的代码any? nil值的方法,因此你得到的错误:“NoMethodError:未定义的方法`any?’ 为零:NilClass“

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

你必须注意你正在做的事情。 ary[0]array.first返回该数组索引处的元素,而不是数组。

empty? 只检查容器中是否有元素。 换句话说,它的大小是否> 0?

 ary.empty? # => false ary.size == 0 # => false ary.size > 0 # => true [].empty? # => true [].size == 0 # => true [].size > 0 # => false 

如果要检查数组是否包含nil:

 [nil, 1, 2].include?(nil) #=> true 
 array = [nil, nil, nil] #=> [nil, nil, nil] array[1].nil? #=> true 
 # 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 

所有这些方法都接受布尔评估的可选块。

您可以通过这种方式将零值转换为布尔值来检查它们

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

但是,使用任何? 检查是否存在某种东西。 您可以使用

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

检查是否有任何值为nil值的值为false 。 如果您的数组中可能有false值,请小心,因为使用此方法也会将其评估为true

或者您可以使用:

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

正如其他海报所暗示的那样

你的问题是你在打电话any? nil上的方法而不是数组上的方法。