Почему array.slice ведет себя по-разному для (length, n)

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

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

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

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

Ответ 1

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

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

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

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

Это называется cons-ing, для "построения" списка. Если идея еще не нажата, рассмотрите это: массив создается путем добавления элементов в пустой список, а не в "nil".