将值赋给一个数组并替换出现的nil值。

9

你好!

当像下面这样给数组赋值时,如何将nil替换为0

array = [1,2,3]
array[10] = 2
array # => [1, 2, 3, nil, nil, nil, nil, nil, nil, nil, 2]

如果在分配时无法实现,那么我应该如何以最佳方式进行操作呢?我考虑使用array.map { |e| e.nil? ? 0 : e },但是......谢谢!

由于我无法得到任何错误值,因此“map”选项似乎足够了。是的,这个混乱的确很混乱。 :) 感谢您的帮助! - Tobias
6个回答

13
改变赋值后的数组:

要改变赋值后的数组:

array.map! { |x| x || 0 }
请注意,这也会将false转换为0
如果你想在赋值期间使用零,那么就有点混乱了:
i = 10
a = [1, 2, 3]
a += ([0] * (i - a.size)) << 2
# => [1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 2]

10

没有内置函数可以替换数组中的nil,所以是的,map是正确的方法。如果更短的版本会让您更高兴,您可以这样做:

array.map {|e| e ? e : 0}

3

如果所有数字都是整数,则nil.to_i为0,下面的代码应该有效。我认为这也是这里最短的答案。

array.map!(&:to_i)

1

要原地修改数组

array.map!{|x|x ?x:0}

如果数组可能包含false,则需要使用这个。
array.map!{|x|x.nil? ? 0:x}

1
a.select { |i| i }

这个答案太短了,所以我要再加上几个词。


2
你可以使用 a.compact 来实现你正在做的功能。 - sachin

0
另一种方法是定义自己的函数来向数组添加值。
class Array
  def addpad(index,newval)
    concat(Array.new(index-size,0)) if index > size
    self[index] = newval
  end
end

a = [1,2,3]
a.addpad(10,2)
a => [1,2,3,0,0,0,0,0,0,0,2]

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