Ruby 为什么array.slice在(长度,n)上的行为不同
如果我有一个数组Ruby 为什么array.slice在(长度,n)上的行为不同,ruby,arrays,Ruby,Arrays,如果我有一个数组a: a[a.length]返回nil。好 a[a.length,x]返回[]。好 a[a.length+x,y]返回nil。与第2条不一致 虽然这种行为很奇怪,但似乎很奇怪 有人能解释一下这种设计背后的原因吗?考虑一下 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] #=&
a
:
a[a.length]
返回nil
。好a[a.length,x]
返回[]
。好a[a.length+x,y]
返回nil
。与第2条不一致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
和数组末尾之间的切片,数组的末尾是[]
其中asa[4]
和a[5,10]
正在访问不在数组中的元素
将切片点视为元素之间,而不是元素本身,这可能会有所帮助。请使用友好的Lispy语言寻找答案。你要寻找的哲学是从专门从事列表处理的语言开始的。例如,这里有一种在Haskell中创建列表的方法:
1:[] => [1]
1:2:3:[] => [1,2,3]
这被称为consing,用于“构建”列表。如果这个想法还没有被点击,考虑一下:一个数组是通过在空列表中添加元素而不是“nIL”来创建的。p> 首先,这个案例是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 = [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
第一个参数被声明为“开始”位置,该位置已经超过数组的末尾(这就是为什么
a[a.length]
为nil
)。如果您使用索引以外的任何东西作为元素,那么这个示例就没有什么意义了。在我看来,这似乎是一个bug,或者是一个文档错误。文档声明,如果索引或起始索引超出范围,则返回nil,因此[4]和[4,10]都应返回nil。这是一个Lispy问题。列表(12)=(cons 1(cons 2 nil))。nil标志着格式正确的列表的结束。SICP中有一章对此进行了解释。看看这个问题,它解释了一点。也许有更好的地方。这并不矛盾。@Steve Weet,看看链接文档中的特殊情况。它的行为如文件所述。前几天我在和Ruby Koans一起工作的时候,正因为这个而自责。我发现这真的不一致和奇怪,但格尼布勒的建议“将切片点看作是元素之间的,而不是元素本身”确实为我澄清了这一切。谢谢另见