我正在玩Array#[]
我IRB
的学习它。我所有的尝试都在下面:
下面的代码就明白了。
[2,3][0..1]
#=> [2, 3]
为什么下面的代码给出empty array
?
[2,3][-1,0]
#=> []
但为什么代码赋予nil
价值?
[2,3][0,-1]
#=> nil
[2,3][1,2]
将从索引 1 开始并选择接下来的 2 个值。
[2,3][-1,0]
将从索引 -1 开始并选择下一个 0 值。-1 从数组的末尾开始并向后工作。
编辑:
要回答更新后的问题,[2,3][0,-1]
将从索引 0 开始,但由于长度不能为负数,因此它将返回nil
.
如果要选择索引之前的值,只需将索引减 1,长度为 1。
编辑2:
Ruby 并非设计为接受负长度值,而是设计为接受负起始值。
此外,在文档“此外,当元素范围的起始索引位于数组末尾时,将返回一个空数组。” - http://www.ruby-doc.org/core-2.0/Array.html#method-i-5B-5D
深入研究 Ruby 源代码后,如果起始索引或长度值小于零,则该rb_ary_subseq
函数将返回。nil
但是在rb_ary_subseq
调用 之前,该rb_ary_aref
函数将负起始索引值更改为正 withstart += array.length
以产生相同的效果。
没有代码可以进行负长度转换。
所以[2,3][-1,0]
将返回一个空数组,因为长度不小于零并且因为引用的文档中的描述。
[2,3][0,-1]
将返回nil
,因为长度小于零。
源代码链接:
rb_ary_aref
- http://rxr.whitequark.org/mri/source/array.c#1042
rb_ary_subseq
- http://rxr.whitequark.org/mri/source/array.c#989