Я не понимаю причины решения этой части Lua. Почему индексация начинается с 1? Я прочитал (как и многие другие) эту замечательную статью . Мне кажется странным уголком языка, который очень приятно изучать и программировать. Не поймите меня неправильно, Lua просто великолепен, но где-то должно быть объяснение. Большая часть того, что я нашел (в Интернете), просто говорит, что индекс начинается с 1. Точка.
Было бы очень интересно прочитать, что говорят его дизайнеры по этому поводу.
Обратите внимание, что я «очень» новичок в Lua, надеюсь, я не упускаю что-то очевидное о таблицах.
Ответы:
Lua произошел от Sol, языка, разработанного для инженеров-нефтяников, не имеющих формального образования в области компьютерного программирования. Люди, не обученные вычислениям, думают, что начинать счет с нуля чертовски странно. Приняв массив на основе 1 и индексирование строк, дизайнеры Lua избежали путаницы в ожиданиях своих первых клиентов и спонсоров.
Хотя вначале я тоже находил их странными, я научился любить массивы на основе 0. Но я хорошо справляюсь с массивами Lua на основе 1, особенно с использованием общего
for
цикла Lua иipairs
оператора - обычно я могу не беспокоиться о том, как индексируются массивы.источник
< length
это намного удобнее и легче читать на «странных языках, основанных на 0». Признаюсь, когда я вижу цикл, повторяющийся с 1, я сразу предполагаю, что он начинается со 2-го элемента: SВ первом обсуждении таблиц « Программирование в Lua » они упоминают:
Позже, в главе о структурах данных, они снова говорят почти то же самое: что встроенные средства Lua предполагают индексирование на основе 1.
Во всяком случае, есть пара удобства для использования индексирования 1 на основе. А именно,
#
оператор (длина):t[#t]
доступ к последнему (числовому) индексу таблицы иt[#t+1]
доступ к 1 после последнего индекса. Для тех, кто еще не сталкивался с индексированием на основе 0,#t+1
было бы более интуитивно понятно пройти за конец списка. Также существуетfor i = 1,#t
конструкция Lua , которая, как я считаю, попадает в ту же категорию, что и предыдущий пункт, что «1 по длине» может быть более разумным, чем индексирование «0 по длине минус 1».Но, если вы не можете сломать мышление об индексировании на основе 0, то индексация на основе 1 в Lua, безусловно, может быть большим препятствием. В конечном итоге авторы хотели, чтобы у них получилось ; и я признаю, что не знаю, какова была их первоначальная цель, но с тех пор она, вероятно, изменилась.
источник
Насколько я понимаю, это так только потому, что авторы думали, что это будет хороший способ сделать это, и после того, как они представили язык широкой публике, это решение значительно изменилось. (Я подозреваю, что было бы адом платить, если бы они изменили его сегодня!) Я никогда не видел особого оправдания, кроме этого.
источник
array[0] == array + 0;
, и подсчет на основе 1 более естественен, когда массив действительно является хеш-таблицей.Возможно, менее важный момент, но я еще не слышал о нем: лучшая симметрия в том, что первый и последний символы в строке имеют значения 1 и -1 соответственно, а не 0 и -1.
источник
Библиотеки 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"
будет правдой.источник
({'a', 'b'})[1]
оценку'b'
не делать этого'a'
? Мне это кажется встроенным.({[0] = 'a', 'b'})[1]
Настоящая причина в том, что этот язык является реализацией определения в законе Португалии, а главный центр разработки находился в Бразилии, и они предпочитают избегать использования нуля, пустоты или ничего в качестве индекса или подстрочного индекса. Однако язык позволяет использовать начальный индекс, отличный от 1, в функции создания таблицы в некоторых версиях.
источник
table [0] ВСЕГДА будет возвращать nil (null), ЕСЛИ вы сами не присвоили ему значение table [0] = 'some value', а затем table [0] вернет 'некоторое значение', которое вы назначили.
Вот пример:
источник
Для каждого имеет смысл, что если
На данный момент
table
пусто. Так когдаВ таблице что-то есть, поэтому она содержит индекс 1 в
table
если вы понимаете, о чем я.Я имел в виду, что таблица [0] существует, и ее таблица = {}, которая пуста, теперь программист не будет вызывать пустую таблицу, он устанавливает их, а затем заполняет ее, будет бесполезно найти пустую table каждый раз, когда вы хотите его вызвать, поэтому проще создать пустую таблицу.
Мой английский не станет лучше, а это моя лучшая грамматика. Если вам это не нравится, вы можете не читать дальше, но если вы даете -rep кому-то, кто пытается помочь, люди вообще не хотят помогать, особенно в том, что касается грамматики. Я человек чисел и переменных, а не грамматики. Сожалею.
источник
0
как единственный элемент, все еще не пуст. На самом деле lua поддерживает это, просто это не стандартное соглашение.