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

Num*_*ers 2 ruby arrays null

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

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

array[1].any?
#=> "NoMethodError: undefined method `any?' for nil:NilClass"
Run Code Online (Sandbox Code Playgroud)

the*_*Man 9

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

ary = [nil, 1]

ary.any?{ |e| e.nil? } # => true
Run Code Online (Sandbox Code Playgroud)

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

将集合的每个元素传递给给定的块.如果块返回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
Run Code Online (Sandbox Code Playgroud)

any?是一个数字的,可以应用于阵列的一个测试,以确定是否存在none?,any?,one?,或all?.

ary.one?{ |e| e == 1 } # => true
ary.none?{ |e| e == 2 } # => true
ary.all? { |e| e.nil? } # => false
Run Code Online (Sandbox Code Playgroud)

你的代码失败是因为你试图将一个不存在的any?方法用于nil值,因此你得到了错误:"NoMethodError:undefined method`any?' 为零:NilClass"

ary[0] # => nil
ary.first # => nil
ary.first.respond_to?(:'any?') # => false
Run Code Online (Sandbox Code Playgroud)

你必须注意你正在做的事情.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
Run Code Online (Sandbox Code Playgroud)


nic*_*oga 6

any?的默认行为是检查数组中的 ant 真值。

# 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
Run Code Online (Sandbox Code Playgroud)

所有这些方法都接受一个可选块来自定义被检查的值,这在您的特定用例中非常方便:

[false, false, false].any?(&:nil?) => false
[false, false, nil].any?(&:nil?) => true
Run Code Online (Sandbox Code Playgroud)


teb*_*oso 5

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

[nil, 1, 2].include?(nil) #=> true
Run Code Online (Sandbox Code Playgroud)