2013-03-25 71 views
0

我正在玩Array#[]在我的IRB中学习它。我所有的尝试如下:IRB中阵列#[]`输出混乱

下面的代码被理解。

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

为什么下面的代码给empty array

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

但为什么代码给nil价值?

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

你正在做一个新的数组,然后立即切片它 – AJcodez 2013-03-25 17:22:37

+0

@AJcodez我的困惑与'nil'输出。无法理解工作。 – 2013-03-25 17:25:10

+0

'[2,3] [2]','[2,3] [2,1]','[2,3] [3]'和[2,3] [3,1]的返回值'更混乱。必须记住一些角落案例。 – 2013-03-25 17:32:32

回答

3

[2,3][1,2]将开始的索引1处并选择下一个2倍的值。

[2,3][-1,0]将从索引-1开始并选择下一个0值。 -1从数组的末尾开始并向后工作。

编辑:

要回答这个问题,更新,[2,3][0,-1]将开始该指数在0,但因为你不能有长度的负数,它将返回nil

如果你想索引之前选择的价值,只是减1的指数,具有长度为1

EDIT2:

红宝石旨在不接受负长度价值,但被设计为接受一个负的初始值。

另外,在文档中“另外,当元素范围的起始索引位于数组末尾时,将返回一个空数组。 - 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]将返回一个空数组,因为长度不小于零,并且由于所引用的文档中的描述。因为长度小于零,因此将返回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

+0

好吧,'0'长度和'-1'长度数组有什么区别,概念上两者应该是'空数组'?但为什么不呢? – 2013-03-25 17:36:15

+0

答复已更新。 – Sam 2013-03-25 18:44:50

+0

如果起始索引小于'0','rb_ary_subseq'函数将返回'nil'。如果是这样的话,为什么'[2,3] [ - 1,0]'确实给了'[]'而不是'nil'? – 2013-03-25 18:55:03