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

时间:2010-07-10 12:46:09

标签: ruby arrays

如果我有一个数组a

  1. a[a.length]返回nil。好。
  2. a[a.length, x]返回[]。好。
  3. a[a.length+x, y]返回nil。与2不一致。
  4. 虽然此行为为documented,但似乎很奇怪。

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

3 个答案:

答案 0 :(得分: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

所以a[4, 10]3和数组末尾之间的切片,[]

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

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

答案 1 :(得分:5)

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

1:[] => [1] 
1:2:3:[] => [1,2,3] 

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

答案 2 :(得分:0)

首先,这种情况是Ruby中的特殊情况

这种特殊情况也有一个解释:

谈到索引数组和切片时,有一点不同。

索引 数组意味着具有唯一的排名,该排名可以帮助您访问给定索引处的值。

另一方面,

切片 意味着在两个点之间“剪切”(此处的P.S点为索引)

考虑一下:

array = [Ruby, PHP, JS, HTML, CSS]

在这种情况下,索引为:

array = [Ruby, PHP, JS, HTML, CSS]
Index =   0.    1.  2.  3.    4. 

在相同情况下的切片将是:

array = [Ruby, PHP, JS, HTML, CSS]
Slice = 0.   1.   2.  3.    4.   5.

因此:

array[5,n] #[] i.e. you get an empty array.
array[6,n] #nil i.e. NIL

Reference