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

StackOverflow https://stackoverflow.com/questions/2785704

  •  03-10-2019
  •  | 
  •  

Вопрос

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

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

Обратите внимание, что я «очень» начинающий в Луа, я надеюсь, что не хватает чего-то очевидного о столах.

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

Но если вы не можете нарушить мышление 0-го индексирования на основе 0, то индексирование на основе 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.

Таблица [0] всегда будет возвращать NIL (NULL), если вы не назначаете ценность для него сам таблицу [0] = «некоторое значение», а затем таблицу [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]))

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

Фактически, что-то круто здесь - внутренние библиотеки Lua будут лечить некоторые пропущенные 0 как 1. Просто будь осторожен при использовании iPARS.
Так что: («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 в функции создания таблицы в некоторых версиях.

Это имеет смысл каждому, что если

table = {}

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

table == {something}

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top