为什么array.slice的行为(长度,n)不同

Die*_*hon 24 ruby arrays

如果我有一个数组a:

  1. a[a.length]回报nil.好.
  2. a[a.length, x]回报[].好.
  3. a[a.length+x, y]回报nil.与2不一致.

虽然这种行为被记录在案,这似乎很奇怪.

任何人都可以解释这种设计背后的原因吗?

Joh*_*ooy 28

考虑一下

a = [0, 1, 2, 3] #=> [0, 1, 2, 3]
a[0, 10]         #=> [0, 1, 2, 3]
a[1, 10]         #=>    [1, 2, 3]
a[2, 10]         #=>       [2, 3]
a[3, 10]         #=>          [3]
a[4, 10]         #=>           []
a[5, 10]         #=>          nil
Run Code Online (Sandbox Code Playgroud)

那么阵列的末端和末尾a[4, 10]之间的切片3也是如此[]

在哪里访问a[4]a[5, 10]访问不在数组中的元素

将切片点视为元素之间而不是元素本身可能会有所帮助.

  • 前几天我在与Ruby Koans合作时,我正在为此而战.我发现它确实不一致和奇怪,但是gnibbler的建议是"将切片点视为元素之间,而不是元素本身"真的为我清除了这一切.谢谢! (4认同)

Thi*_*rry 5

看看你友好的Lispy语言的答案.您正在寻找的理念始于其专业是LISt Processing的语言.例如,这是在Haskell中创建列表的一种方法:

1:[] => [1] 
1:2:3:[] => [1,2,3] 
Run Code Online (Sandbox Code Playgroud)

这被称为consing,用于"构建"列表.如果想法还没有点击,请考虑这个:通过向空列表添加元素来创建数组,而不是'nil'.