Почему 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".