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
    和数组末尾之间的切片,数组的末尾是
    []

    其中as
    a[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一起工作的时候,正因为这个而自责。我发现这真的不一致和奇怪,但格尼布勒的建议“将切片点看作是元素之间的,而不是元素本身”确实为我澄清了这一切。谢谢另见