如果我有一个数组a
:
a[a.length]
返回nil
。好。a[a.length, x]
返回[]
。好。a[a.length+x, y]
返回nil
。与2不一致。虽然此行为为documented,但似乎很奇怪。
有人可以解释这种设计背后的原因吗?
答案 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