为什么这个数组切片返回一个空数组而不是nil?

时间:2011-04-07 16:25:14

标签: ruby-on-rails ruby

  

可能重复:
  Array slicing in Ruby: looking for explanation for illogical behaviour (taken from Rubykoans.com)

我一直在玩ruby中的数组切片,但我不明白下面的最后2个结果:

a = [1,2,3]
a[2,1]      # output is [3]
a[3,1]      # output is []    ...why??
a[4,1]      # output is nil   ...according to the docs this makes sense

为什么a[3,1]为空数组而a[4,1]为零?

如果有的话,我希望a[3,1]也能返回nil。根据{{​​3}},如果起始索引超出范围,则数组拆分应返回nil。那么为什么a[3,1]没有返回nil?

注意:这是在ruby 1.9.2

3 个答案:

答案 0 :(得分:4)

你要求数组结束,[]。以这种方式看待:数组[1,2,3]可以被认为是由增量单元格构建的:(1, (2, (3, ()))1:2:3:[]。第三个索引(第4项)显然是[]

答案 1 :(得分:1)

“如果索引(或起始索引)超出范围,则返回nil。”

根据同一链接中的示例,

a[3,1]是一种特殊情况。

顺便提一下,可以看到更多信息:Array slicing in Ruby: looking for explanation for illogical behaviour (taken from Rubykoans.com)

答案 2 :(得分:0)

如果您想象分配的左侧侧的切片,则更容易理解为什么。

>> (b = a.clone)[2,1] = :a; p b
[1, 2, :a]
>> (b = a.clone)[2,0] = :b; p b
[1, 2, :b, 3]
>> (b = a.clone)[3,1] = :c; p b
[1, 2, 3, :c]
>> (b = a.clone)[3,0] = :d; p b
[1, 2, 3, :d]