我一直在玩数组,我不明白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"]
提前感谢您的帮助!
答案 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]
。