为什么这会返回零?

Why is this returning nil?

我一直在摆弄数组,但我不明白 Nil 是从哪里来的以及为什么 a[4] 没有被覆盖。请看下面我的例子。

a = Array.new 
a[5] = '5';
a[0, 3] = 'a', 'b', 'c', 'd';
a[4] = 'hello'
template = ERB.new "<%= a %>"
puts template.result(binding)

返回结果

["a", "b", "c", "d", "hello", nil, "5"] 

a = Array.new 
a[4] = '5';
a[0, 3] = 'a', 'b', 'c', 'd';
a[4] = 'hello'
template = ERB.new "<%= a %>"
puts template.result(binding)

返回结果

["a", "b", "c", "d", "hello", "5"]

在此先感谢您的帮助!

这个很简单。

您正在定义一个最初为空的数组。在 Ruby 中,如果您向越界数组中插入一个值,它将用 nil 填充所有其他过去的索引。

例如,如果我这样做:

a = []
a[9] = '10'
puts a

输出将是:

[nil, nil, nil, nil, nil, nil, nil, nil, nil, "10"]

我插入的前九个索引都会被nil填充。这是什么都没有的表示。

在 Ruby 当你说:

a[0, 3] = a, b, c

表示从索引0开始往数组中插入3个对象。但如果你说

a[0, 3] = a, b, c, d

由于它们多于三个元素,因此在第三个对象之后插入另一个元素,因此将 5 及其前面的 nil 移动到下一个位置。

实际上是:

a[start, length]

没有

a[start, end]

问题(正如 Pedram 在我键入此内容时解释的那样)是 a[0, 3] = 'a', 'b', 'c', 'd' 不会替换从 a[0]a[3] 的值。它替换了从 a[0] 开始的 3 个值(a[0]a[1]a[2]),但是由于您给它提供了 4 个值,它会将第四个值作为新元素插入在 a[2].

之后

如果要使用索引范围,请使用a[0..3]。或者你可以使用 a[0, 4].