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

时间:2014-06-23 22:47:19

标签: ruby arrays null

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

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

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

5 个答案:

答案 0 :(得分:7)

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

ary = [nil, 1]

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

The documentation很好地解释了这一点:

  

将集合的每个元素传递给给定的块。如果块返回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?any?one?或{{3} }。

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

您的代码失败是因为您尝试使用不存在的any?方法获取nil值,因此出现了错误:“NoMethodError:undefined method`any?'为零:NilClass“

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

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

all?仅检查容器中是否包含元素。换句话说,它的大小是否> 0?

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:2)

array = [nil, nil, nil]
#=> [nil, nil, nil]
array[1].nil?
#=> true

答案 3 :(得分:2)

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

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

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

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

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

或者您可以使用:

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

正如其他海报所建议的那样

您的问题是您在nil上调用any?方法而不在数组上调用。

答案 4 :(得分:2)

# 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

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