我正在玩Array#[]
在我的IRB
中学习它。我所有的尝试如下:IRB中阵列#[]`输出混乱
下面的代码被理解。
[2,3][0..1]
#=> [2, 3]
为什么下面的代码给empty array
?
[2,3][-1,0]
#=> []
但为什么代码给nil
价值?
[2,3][0,-1]
#=> nil
我正在玩Array#[]
在我的IRB
中学习它。我所有的尝试如下: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
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'长度和'-1'长度数组有什么区别,概念上两者应该是'空数组'?但为什么不呢? – 2013-03-25 17:36:15
答复已更新。 – Sam 2013-03-25 18:44:50
如果起始索引小于'0','rb_ary_subseq'函数将返回'nil'。如果是这样的话,为什么'[2,3] [ - 1,0]'确实给了'[]'而不是'nil'? – 2013-03-25 18:55:03
你正在做一个新的数组,然后立即切片它 – AJcodez 2013-03-25 17:22:37
@AJcodez我的困惑与'nil'输出。无法理解工作。 – 2013-03-25 17:25:10
'[2,3] [2]','[2,3] [2,1]','[2,3] [3]'和[2,3] [3,1]的返回值'更混乱。必须记住一些角落案例。 – 2013-03-25 17:32:32