在Ruby中添加nil对象作为数组的元素

时间:2010-08-12 20:22:38

标签: ruby

我可以拥有一个以nil作为值的数组吗?例如[1, 3, nil, 23]

我有一个数组,我在其中nil分配array = nil,然后我想迭代它,但我不能。 .each方法无法说nil类。

是否可以这样做?

6 个答案:

答案 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 = nilnil分配给恰好(误导性地)命名为'array'的变量。如果该变量先前指向数组,则该连接现在已断开。

您可能会考虑使用索引位置进行分配,但array[4] = nilarray = 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]