Ответ 1
Что нужно использовать, это вопрос предпочтений и обстоятельств: поскольку оператор длины #
был введен в версии 5.1, t[#t+1] = i
не будет работать в Lua 5.0, тогда как table.insert
присутствует с 5.0 и будет работать в и то и другое. С другой стороны, t[#t+1] = i
использует исключительно языковые операторы, но table.insert
включает в себя функцию (которая имеет небольшое количество накладных расходов для поиска и вызова и зависит от модуля table
в среде).
Во втором издании Программирование в Lua (обновление первого издания Lua 5.0), Роберто Иерусульсамчий (дизайнер Lua ) утверждает, что он предпочитает t[#t+1] = i
, поскольку он более заметен.
Кроме того, в зависимости от вашего варианта использования ответ может быть "ни". Смотрите ручную запись о поведении оператора длины:
Если массив имеет "дыры" (то есть значения nil между другими значениями, отличными от nil), то #t может быть любым из индексов, который непосредственно предшествует значению nil (то есть он может рассматривать любое такое значение nil как конец массива).
Как таковой, если вы имеете дело с массивом с дырками, используя один (table.insert
использует оператор длины), может "добавьте" ваше значение в более низкий индекс в массиве, чем вы хотите. Как вы определяете размер вашего массива в этом сценарии, зависит от вас и, опять же, зависит от предпочтений и обстоятельств: вы можете использовать table.maxn
(исчезая в 5.2, но тривиально писать), вы можете сохранить поле n
в таблице и при необходимости обновите ее, вы можете обернуть таблицу в метатебель или вы можете использовать другое решение, которое лучше подходит для вашей ситуации (в цикле часто бывает local tsize
в области, непосредственно за пределами цикла).