Ruby如何处理数组范围访问?

18
ruby-1.8.7-p174 > [0,1][2..3]
 => [] 
ruby-1.8.7-p174 > [0,1][3..4]
 => nil
在一个从0开始的设置中,其中索引2、3和4实际上都超出了2项数组的范围,为什么它们会返回不同的值?

3
您的问题比较简洁,但不幸的是,它可能是重复的。与Array slicing in Ruby: looking for explanation for illogical behaviour (taken from Rubykoans.com)类似。在两种情况下,都会有同样的惊喜:在终止索引处,出现了nil和[]这两种不同的结果。 - Ciro Santilli OurBigBook.com
哇,重复被拒绝了。为什么? - Ciro Santilli OurBigBook.com
不错的问题。我已经发出了一个标记请求重新评估或解释。我很好奇学习这样做的理由。 - pjvleeuwen
1个回答

30

这是一个已知的麻烦角落。请查看Array#slice的rdoc示例。

这个特定问题被列为“特殊情况”。

   a = [ "a", "b", "c", "d", "e" ]
   a[2] +  a[0] + a[1]    #=> "cab"
   a[6]                   #=> nil
   a[1, 2]                #=> [ "b", "c" ]
   a[1..3]                #=> [ "b", "c", "d" ]
   a[4..7]                #=> [ "e" ]
   a[6..10]               #=> nil
   a[-3, 3]               #=> [ "c", "d", "e" ]
   # special cases
   a[5]                   #=> nil
   a[5, 1]                #=> []
   a[5..10]               #=> []
如果起始位置正好在数组的末尾之后一个项目,则会返回一个空数组[]。如果起始位置超出了这个范围,则返回nil。虽然有记录,但我不确定原因。

请参考此答案及相关评论,其中将差异描述为“栅栏式计数”和“索引”。我同意Ciro的看法,这个问题是重复的。对于阅读此问答的人,请注意在那个重复问题中存在更多细节解释“为什么”。 - pjvleeuwen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接