这为什么会回来的?

时间:2015-01-05 19:44:41

标签: ruby-on-rails ruby

我一直在玩数组,我不明白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"]

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:4)

在Ruby中,当你说:

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

这意味着从索引0开始,将3个对象插入到数组中。但如果你说

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

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

实际上是:

a[start, length]

a[start, end]

答案 1 :(得分:2)

这很简单。

您正在定义一个最初为空的数组。在Ruby中,如果要将值插入到一个超出范围的数组中,它将使用nil填充所有其他过去的索引。

例如,如果我这样做:

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

输出将是:

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

我插入的所有九个索引都将填充nil。什么都没有代表。

答案 2 :(得分:2)

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

如果要使用一系列索引,请使用a[0..3]。或者您可以使用a[0, 4]