a = [1,2,3,4]
a[4,43]
# => []
a[5,43]
# => nil
这种异常的原因是什么?
假设你的意思是:
a = [1,2,3,4,5]
a[5,43]
# => []
a[6,43]
# => nil
从http://bugs.ruby-lang.org/issues/4245:
这是每个规格。
这样想:
[5..-1]:给我从第 5 个到最后一个的所有元素。没有,所以[]
[6..-1]:给我从第 6 个到最后一个的所有元素。说什么?没有第 6 个,因此在给定请求超出范围时返回 nil。
我同意 spartacus 和 Dylan 链接中的错误报告者的观点——确实存在不一致之处,并且 Array#slice 可以使用更改。虽然是的,但它是规范;从数组#slice
对于
start
和range
情况,起始索引就在元素之前。此外,当元素范围的起始索引位于数组末尾时,将返回一个空数组...如果索引(或起始索引)超出范围,则返回 nil。
[ 0, 1, 2, 3 ]
^ ^ ^ ^ ^
0 1 2 3 4
假设数组 a 被构造为 [0,1,2,3] ,帽子下方的数字表示使用 a[start,length] 形式时“开始”的位置。所以 a[0,0] 是 [],a[1,0] 是 [],因为我们没有“跳跃”到任何地方。同样,a[4,0] 是 [],这很好。
现在 a[4,x] 其中 x 是任何非零数,在我看来,应该返回 nil,因为 a[4] 是未定义的,理论上, a[4,x] 要求的数组看起来像 [未定义,未定义...]
然而,对于范围,似乎一个数组是从范围中出现的所有索引构建的,因此“帽子”开始可视化不适用。因此 a[0..2] 在这种情况下返回 [a[0],a 1 ,a[2]] 或 [0,1,2]。
a[4..x]应该为任何 x 返回 nil,因为没有 a[4]。