Почему массивы (таблицы) Lua начинаются с 1 вместо 0? - PullRequest
113 голосов
/ 07 мая 2010

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

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

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

Ответы [ 9 ]

127 голосов
/ 07 мая 2010

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

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

41 голосов
/ 07 мая 2010

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

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

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

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

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

22 голосов
/ 06 августа 2013

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

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

чем:

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

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

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

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

14 голосов
/ 07 мая 2010

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

5 голосов
/ 06 августа 2012

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

1 голос
/ 22 декабря 2017

Библиотеки 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" будет истинным.

 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
1 голос
/ 07 ноября 2016

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

Вот пример:

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]))
0 голосов
/ 06 декабря 2011

Каждый имеет смысл, что если

table = {}

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

table == {something}

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

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

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

0 голосов
/ 24 ноября 2010

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

...