Почему Lua массивы (таблицы) начинаются с 1 вместо 0?

Я не понимаю рационального решения этой части Луа. Почему индексирование начинается с 1? Я прочитал (как и многие другие) эту замечательную статью. Мне кажется странным уголком языка, который очень приятно учиться и программировать. Не поймите меня неправильно, Lua просто отлично, но где-то должно быть объяснение. Большая часть того, что я нашел (в Интернете), просто говорит, что индекс начинается с 1. Полная остановка.

Было бы очень интересно прочитать, что говорили его дизайнеры о предмете.

Обратите внимание, что я "очень" новичок в Lua, надеюсь, что я не пропущу что-то очевидное о таблицах.

Ответ 1

Lua происходит от Sol, язык, предназначенный для инженеров-нефтяников, не имеющих официального обучения компьютерному программированию. Люди, не обученные компьютерам, считают, что чертовски странно начинать отсчет с нуля. Принимая 1-разрядный массив и индексирование строк, дизайнеры Lua избегали смешения ожиданий своих первых клиентов и спонсоров.

Хотя я тоже нашел их странными в начале, я научился любить массивы на основе 0. Но я получаю ОК с Lua 1-based массивами, особенно используя генератор Lua generic for и оператор ipairs: я обычно могут не беспокоиться о том, как индексируются массивы.

Ответ 2

В Программе в первом обсуждении таблиц Lua они упоминают:

Поскольку вы можете индексировать таблицу с любым значением, вы можете запускать индексы массива с любым числом, которое вам нравится. Однако в Lua принято запускать массивы с 1 (а не с 0, как в C), и несколько объектов придерживаются этого соглашения.

Позже, в главе о структурах данных, они говорят почти то же самое: Lua встроенные объекты предполагают индексирование на основе 1.

В любом случае, есть пара удобств для использования индексации на основе 1. А именно, оператор # (length): t[#t] обращается к последнему (числовому) индексу таблицы, а t[#t+1] обращается к 1 за последним индексом. Для того, кто еще не был подвергнут индексированию на основе 0, #t+1 было бы более интуитивным, чтобы перейти за конец списка. Также существует конструкция Lua for i = 1,#t, которая, по моему мнению, относится к той же категории, что и предыдущая точка, что "1 по длине" может быть более разумным, чем индексирование "0 до длины минус 1".

Но, если вы не можете сломать мышление индексации на основе 0, то индексирование на основе Lua 1, безусловно, может быть скорее помехой. В конечном счете, авторы хотели что-то, что сработало для них; и я признаю, что не знаю, какова была их первоначальная цель, но с тех пор она, вероятно, изменилась.

Ответ 3

Есть одна очень важная причина НЕ подсчитывать массивы из 1: Если массивы начинаются с нуля, вы можете использовать их как алгебраические кольца естественным образом. Например. у нас есть дни недели (day={'mo', 'tu', 'we'...), и мы хотим CYCLE через них. Тогда было бы гораздо меньше уматать:

nextday = day[(i+1)%7]  as it is in almost every other language

чем:

nextday = day[i%7+1] as it is in lua

похоже, сначала не так плохо, но попробуйте провести неделю в другую сторону.

Или в общем случае: если в наборе индексов отсутствует нуль, в нем отсутствует нейтральный элемент сложения. Всякий раз, когда это необходимо в расчетах индекса, индексы должны быть сдвинуты.

Я математик, но я принял тот факт, что когда дело доходит до программирования, подсчет с нуля - это лучший вариант.

Ответ 4

Я понимаю, что именно так, потому что авторы думали, что это будет хороший способ сделать это, и после того, как они перевернут язык публике, решение которого значительно засохло. (Я подозреваю, что ад будет платить, если бы они изменили его сегодня!) Я никогда не видел особого оправдания за этим.

Ответ 5

Возможно, менее значимый момент, но я еще не слышал об этом: лучше симметрии в том, что первый и последний символы в строке равны 1 и -1 соответственно, а не 0 и -1.

Ответ 6

table [0] ВСЕГДА возвратит nil (null), ЕСЛИ вы присваиваете ему значение для себя table [0] = 'some value', а затем таблица [0] вернет "некоторое значение", которое вы назначили.

Вот пример:

tbl={'some'}
print('tbl[0]='..tostring(tbl[0]))
print('tbl[1]='..tostring(tbl[1]))
nothing={}
print('nothing[0]='..tostring(nothing[0]))
print('nothing[1]='..tostring(nothing[1]))
nothing[0]='hey'
print('(after assign)\nnothing[0]='..tostring(nothing[0]))

Ответ 7

Библиотеки Lua предпочитают использовать индексы, начинающиеся с 1. Однако вы можете использовать любой нужный вам индекс. Вы можете использовать 0, вы можете использовать 1, вы можете использовать -5. Это даже в их руководстве, которое можно найти на (https://www.lua.org/pil/11.1.html).

На самом деле, что-то классное здесь - внутренние библиотеки lua будут обрабатывать НЕКОТОРЫЕ переданные 0 как 1. Просто будьте осторожны при использовании ipairs.
Так что: ( "abc" ): sub (0,1) == "a" и ( "abc" ): sub (1,1) == "a" будет true.

 You can start an array at index 0, 1, or any other value:

-- creates an array with indices from -5 to 5
a = {}
for i=-5, 5 do
  a[i] = 0
end

Ответ 8

Настоящая причина заключается в том, что язык является реализацией определения в законодательстве Португалии, а основной центр развития находится в Бразилии, и их предпочтение заключается в том, чтобы избежать использования нуля или пустоты или ничего как индекса или индекса. Однако язык позволяет использовать начальный индекс, отличный от 1, в функции создания таблицы в некоторых версиях.

Ответ 9

Это имеет смысл для каждого, что если a

table = {}

В настоящий момент table пусто. Итак, когда

table == {something}

В таблице содержится что-то такое, что она содержит индекс 1 в table, если вы знаете, что я имею в виду.

То, что я имел в виду, это таблица [0] существует, а ее таблица = {}, которая пуста, теперь программист не будет вызывать пустую таблицу, она их устанавливает, а затем заполняет, это будет бесполезно находить пустую таблицу каждый раз, когда вы хотите ее называть, поэтому ее проще просто создать пустую таблицу.

Мой английский не улучшится, а моя лучшая грамматика. Если вам это не нравится, вы можете не читать его, но давать -rep для тех, кто пытается помочь, заставляет людей не хотеть вообще помогать, особенно для чего-то вроде грамматики. Я человек чисел и варсов, а не грамматика. К сожалению.