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



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



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



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

906   10  

10 ответов:

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

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

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

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

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

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

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

есть одна очень существенная причина не считать массивы от 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

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

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

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

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

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

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]))

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

на самом деле, что-то классное здесь-это внутренние библиотеки lua, которые будут рассматривать некоторые переданные 0 как 1. Просто будьте осторожны при использовании ipairs.
Так что: ("АВС"):подводная лодка(0,1) == "A" и ("АВС"):подводная лодка(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, в функции создания таблицы в некоторых версиях.

это было сделано после Sol, язык программирования, сделанный людьми и для людей без опыта программирования

пример

предположим, вы хотите записать запись длиной 3 байта в массив в позиции i

на языке, основанном на 0, это формула для поиска смещения байта, с которого начинается запись:

var ptr = 3 * i

первый элемент (i=0) дает вам смещение 0. Второй элемент (i=1) дает вам смещение 3. и так далее...

на 1-основе языка, сначала вы пытаетесь то же самое:

var ptr = 3 * i

первая позиция (i = 1) дает вам 3 в качестве смещения, но вы должны получить 1. Чтобы вычесть 2, чтобы получить 1.

var ptr = 3 * i - 2

пока все хорошо. Теперь вы пытаетесь, если формула работает с i=2. Вы получаете 4 и это правильно.

общая формула выглядит так:

var ptr = L * (i-1) + 1

еще один пример

вычисление следующего смещения, когда объединение двух строк также приводит к сложной формуле:

в 0-based вы найдете смещение следующим образом:

var ptr = Len(string1) + Len(string2)

в 1-based это формула

var ptr = Len(string1) + Len(string2) + 1

я оставляю умножение матриц в качестве упражнения : -)

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

С математической точки зрения может быть то же самое, используя 0-based или 1-based, на компьютере, в котором индекс в основном смещение от начальной точки, не

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

table = {}

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

table == {something}

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

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

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

Comments

    Ничего не найдено.