与IRB中的“Array#[]”输出混淆



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

下面的代码可以理解。

[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。

EDIT2:

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函数将start += array.length的负起始索引值更改为正,以获得相同的效果。

没有进行负长度转换的代码。

因此[2,3][-1,0]将返回一个空数组,因为长度不小于0,并且因为引用的文档中的描述。

[2,3][0,-1]将返回nil,因为长度小于0。

源代码链接:

rb_ary_aref - http://rxr.whitequark.org/mri/source/array.c#1042

rb_ary_subseq - http://rxr.whitequark.org/mri/source/array.c#989

最新更新