0

我正在玩Array#[]IRB的学习它。我所有的尝试都在下面:

下面的代码就明白了。

[2,3][0..1]
#=> [2, 3]

为什么下面的代码给出empty array

[2,3][-1,0]
#=> []

但为什么代码赋予nil价值?

[2,3][0,-1]
#=> nil
4

1 回答 1

3

[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

于 2013-03-25T17:08:42.523 回答