代码之家  ›  专栏  ›  技术社区  ›  Diego Mijelshon

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

  •  23
  • Diego Mijelshon  · 技术社区  · 15 年前

    如果我有一个数组 a :

    1. a[a.length] 收益率 nil . 很好。
    2. a[a.length, x] 收益率 [] . 很好。
    3. a[a.length+x, y] 收益率 . 与2不一致。

    当这种行为 documented 看起来很奇怪。

    有人能解释这个设计背后的原因吗?

    3 回复  |  直到 7 年前
        1
  •  28
  •   Stefan    10 年前

    考虑这个

    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] 正在访问不在数组中的元素

    它可能有助于将切片点视为元素之间,而不是元素本身。

        2
  •  5
  •   Thierry    10 年前

    寻找你的友好的口齿不清的语言的答案。你要寻找的哲学是从语言开始的,语言的专业是列表处理。例如,以下是在Haskell中创建列表的一种方法:

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

    这被称为构造列表。如果这个想法还没有点击,考虑一下:数组是通过向空列表中添加元素而创建的,而不是“nil”。

        3
  •  0
  •   Abhishek Jain    7 年前

    首先,这个案例是 特例 红宝石。

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

    当您谈到索引数组并对其进行切片时,有一点不同。

    标引 数组意味着有一个唯一的位置,可以帮助您访问给定索引中的值。

    切片 另一方面,意味着在两个点之间“切割”(这里的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