如何检查数组中是否有nil集合?

6
如果我将一些`nil`值设置到一个数组中,似乎无法检查它们。我已经尝试过`any?`和`empty?`。
array = [nil, nil, nil]
#=> [nil, nil, nil]

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

17

any?用于迭代容器,例如数组,并检查传递给它的每个元素是否通过了测试。如果有一个元素通过了测试,循环就会停止并返回true

ary = [nil, 1]

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

文档 解释得很清楚:

将集合的每个元素传递给给定的块。如果块返回除false或nil之外的值,则该方法返回true。如果没有给出块,则Ruby会添加一个隐式块 { |obj| obj },如果集合成员中至少有一个不是false或nil,any? 将返回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?all?

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

你的代码失败是因为你试图在空值上使用不存在的any?方法,因此出现了错误:"NoMethodError: undefined method `any?' for nil: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

1
谢谢!args.any?(&:nil?) 对我来说更好看。 - Alex Strizhak

9

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

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

有时候,最好的方法就是最简单的方法,因为每个人一看代码就能立即理解意图。特别是当我回来看它时,更应该如此。我不想再遇到“为什么会这样工作?”的时刻了。已经够多了。这应该标记为最佳答案。 - codenoob

7

any? 的默认行为是检查数组中是否存在任何值。

# 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

所有这些方法都接受一个可选块来自定义要检查的值,在你特定的用例中非常方便。
[false, false, false].any?(&:nil?) => false
[false, false, nil].any?(&:nil?) => true

Numbers 只关心 nil,而不是 nilfalse - Cary Swoveland

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

2
您可以通过以下方式将nil值转换为布尔值来检查它们:

您可以这样将nil值转换为布尔值来检查它们

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?方法而不是在数组上调用。


Numbers 只关心 nil,而不是 nilfalse - Cary Swoveland
你说得对,这就是为什么我也加了关于 nil 的部分 :) - onetwopunch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接