Почему array.slice ведет себя иначе для (length, n) - PullRequest
23 голосов
/ 10 июля 2010

Если у меня есть массив a:

  1. a[a.length], возвращает nil.Хорошо.
  2. a[a.length, x] возвращает [].Хорошо.
  3. a[a.length+x, y] возвращает nil.Не соответствует 2.

Хотя это поведение задокументировано , оно выглядит странным.

Кто-нибудь может объяснить причины такого дизайна?

Ответы [ 3 ]

28 голосов
/ 10 июля 2010

Рассмотрим это

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] обращаются к элементам, которых нет в массиве

Может быть полезно думать о точках среза, как об элементах, а не о самих элементах.

5 голосов
/ 05 марта 2012

Посмотрите на ваши дружественные языки Lispy для ответа. Философия, которую вы ищете, началась с языков, специальность которых - LISt Processing. Например, вот один из способов создания списков в Haskell:

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

Это называется consing, для «построения» списка. Если идея еще не реализована, учтите следующее: массив создается путем добавления элементов в пустой список, а не в «nil».

0 голосов
/ 08 февраля 2019

Начнем с того, что в данном случае это особый случай в Ruby.

В этом особом случае также есть объяснение:

Существует разницакогда вы говорите об индексации массива и обрезании его.

Индексирование массив означает наличие уникальной позиции, которая помогает вам получить доступ к значению в данном индексе.

Нарезка с другой стороны означает «разрезать» между двумя точками (точки PS здесь являются индексными)

Учтите это:

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

Ссылка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...