为什么这会返回零?
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]
.
我一直在摆弄数组,但我不明白 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]
.