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

125

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

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

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

арак
источник
23
Область действия по умолчанию также глобальная. Два самых больших недостатка Lua.
Ян Рамин
37
Я бы не назвал начало с 1 недостатком. На самом деле это имеет больше смысла - программисты настолько хорошо обучены мыслить в терминах индексирования на основе 0 с других языков, что нам это не нравится. Нас также учат думать 5/2 = 2. Это неверно.
BlueRaja - Дэнни Пфлугофт,
54
@ BlueRaja-DannyPflughoeft: нет. Нулевое индексирование имеет больше смысла - люди настолько хорошо обучены начинать счет с 1, что языки, начинающиеся с 0, изначально сбивают с толку. Но я хотел бы порекомендовать
вам
11
@nightcracker: Когда вы считаете яблоки на столе, вы считаете первое как «одно», второе как «два» и т. д. Никто не считает первое за «ноль», а затем добавляет единицу в конце; считая от нуля просто, бесспорно, нелогичным. Да, я понимаю, как индексация работает внутри, но именно поэтому мы называем это абстракцией.
BlueRaja - Дэнни Пфлугхофт
9
Я никогда не понимал всей любви к 0-индексному индексированию. Это хорошо для смещений (сколько элементов пропустить с самого начала?) И подпоследовательностей (0 ≤ x <n), но выглядит неправильно для основных вещей (второй элемент называется одним? Десятый элемент соответствует девятому индексу? WAT?) , Даже программисты считают от 1, когда пытаются найти строку, сообщенную компилятором ...
Маркус

Ответы:

143

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

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

Норман Рэмси
источник
7
Это просто историческая, маркетинговая причина. Нет разумной причины, особенно в настоящее время. И кажется, что даже вы пытаетесь избежать индексирования на основе 1 вместо того, чтобы использовать его :)
eonil
27
@Eonil фактически избегает явного индексирования, что снижает количество ошибок индексации.
Дэн Д.
8
@Eonil исторические причины обычно имеют отношение к делу. Вы начинаете с чего-то и никогда не можете это изменить, потому что это нарушит весь существующий код. Особенно плохо для индексации 0 против 1, так как то, как она ломается, довольно незаметно.
CodesInChaos 06
5
Разница заключается между переходом от 1 к Length и от 0 к length -1, но в цикле for < lengthэто намного удобнее и легче читать на «странных языках, основанных на 0». Признаюсь, когда я вижу цикл, повторяющийся с 1, я сразу предполагаю, что он начинается со 2-го элемента: S
Felype
45

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

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

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

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

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

Марк Рушаков
источник
16

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

штрих-кот-бэнг
источник
6
Возможное обоснование: C сделал это только потому, что массив в основном представляет собой просто указатель array[0] == array + 0;, и подсчет на основе 1 более естественен, когда массив действительно является хеш-таблицей.
Судья Мэйгарден,
19
Индексы Lua на самом деле являются индексами. В C, когда вы говорите index, вы на самом деле имеете в виду смещение.
Alex
8

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

VXZ
источник
8
Хотя это и приятно, но это не было причиной для начала в 1.
lhf 06
3

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

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

 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
user2262111
источник
Есть ли способ заставить ({'a', 'b'})[1]оценку 'b'не делать этого 'a'? Мне это кажется встроенным.
Ремрам
1
({[0] = 'a', 'b'})[1]
user2262111
0

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

разработчик
источник
5
Даже если это правда, это совершенно не имеет отношения к тому, как был разработан Lua.
lhf
-1

table [0] ВСЕГДА будет возвращать nil (null), ЕСЛИ вы сами не присвоили ему значение table [0] = 'some value', а затем table [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]))
BladeMight
источник
-11

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

table = {}

На данный момент tableпусто. Так когда

table == {something}

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

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

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

Wesker
источник
4
Я не понимаю, что таблица имеет значение 0. Таблица может иметь длину 0. Но это не зависит от выбора первого индекса. Меня не волнуют мелкие грамматические ошибки, но я просто не понимаю сути вашего ответа, поэтому я проголосовал против.
CodesInChaos 06
вот что я имею в виду, таблица не может храниться с индексом или значением 0, поскольку мы используем ее как пустую таблицу <, <когда у вас есть что-то, это что-то, представленное из 1, "n", поэтому, когда у вас ничего нет, ваш пустой чего-то, что приводит нас к cero, но cero dosnt count, lua - это язык, который приходит с практической точки зрения, вы не выходите на улицу и не говорите своим друзьям, что знаете, что у меня есть 0 песен этих исполнителей, есть ли у вас некоторые, или вы не делает. точка its table = {} это Cero пустая таблица
Wesker
5
Массив, который использует индекс 0как единственный элемент, все еще не пуст. На самом деле lua поддерживает это, просто это не стандартное соглашение.
CodesInChaos 06
да, я согласен с вами, на некоторых других языках, но не на lua, существует lua index 0 dosnt, поэтому мы можем представить это как empty = 0, или вот как я это представляю, даже когда вы можете заставить индекс быть 0, он не будет работать со значениями таблицы #table не будет читать индекс 0, поэтому я отвечаю, что lua в основном сделан как обычное событие, теперь, если они намерены это или нет, это не очень важно, вы не будете снова писать код отверстия, и мы ничего не можем с этим поделать: /, я до сих пор верю, что справедливо сказать, что в lua пустая таблица имеет индекс 0
Вескер