我可以拥有一个以nil
作为值的数组吗?例如[1, 3, nil, 23]
。
我有一个数组,我在其中nil
分配array = nil
,然后我想迭代它,但我不能。 .each
方法无法说nil
类。
是否可以这样做?
答案 0 :(得分:9)
使用:
a = [nil]
示例:
> a = nil => nil > a.each{|x|puts x} NoMethodError: undefined method `each' for nil:NilClass from (irb):3 from :0 > a= [nil] => [nil] > a.each{|x|puts x} nil => [nil]
答案 1 :(得分:3)
我相信你的问题在于你为数组“分配nil”
arr = []
arr = nil
这就像你试过的那样吗?在这种情况下,您不会将nil
分配给您为变量nil
指定的数组arr
,因此arr
现在为nil
提供有关“零级“
答案 2 :(得分:3)
我认为你把一个项目添加到一个数组中,并为变量赋值为nil,这是令人困惑的。
向数组(两个方向)添加一个项目(结束):
array.push(item)
# or if you prefer
array << item
# works great with nil, too
array << nil
我假设数组已经存在。如果没有,您可以使用array = []
或array = Array.new
创建它。
另一方面,array = nil
将nil
分配给恰好(误导性地)命名为'array'的变量。如果该变量先前指向数组,则该连接现在已断开。
您可能会考虑使用索引位置进行分配,但array[4] = nil
与array = nil
非常不同。
答案 3 :(得分:3)
当然可以。您可能正在尝试使用nil
对象执行某些操作,而不检查它是否为nil?
。
C:\work>irb
irb(main):001:0> a = [1,2,nil,3]
=> [1, 2, nil, 3]
irb(main):003:0> a.each{|i|
irb(main):004:1* if i.nil? then
irb(main):005:2* puts ">NADA>"
irb(main):006:2> else
irb(main):007:2* puts i
irb(main):008:2> end
irb(main):009:1> }
1
2
>NADA>
3
=> [1, 2, nil, 3]
irb(main):010:0>
答案 4 :(得分:1)
如何将nil值存储在数组中存在问题。这是一个显示数组如何工作的示例:
a = nil
b = [nil]
c = []
c.push(nil)
# a is nil
# b is [nil]
# c is now [nil]
因此,“ b”和“ c”都创建了一个具有nil属性的数组,而“ a”只是将变量设置为nil(不是数组)。
使用'b'或'c',您现在应该可以毫无问题地运行.each
答案 5 :(得分:0)
使用Enumerable #map
ruby-1.8.7-p249 > [1,2,nil,4].map{|item| puts item}
1
2
nil
4
=> [nil, nil, nil, nil]
请注意,即使数组中每个项的返回值为nil,原始数组也是如此。如果你对数组中的每个项目进行操作,它将返回每个操作的值。你可以摆脱nils购买压缩它。
ruby-1.8.7-p249 > [1,2,nil,4].map{|item| item + 1 unless item.nil? }
=> [2, 3, nil, 5]
ruby-1.8.7-p249 > [1,2,nil,4].map{|item| item + 1 unless item.nil? }.compact
=> [2, 3, 5]