Что использовать, это вопрос предпочтений и обстоятельств: так как оператор длины #
был представлен в версии 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
, так как он болееvisible.
Кроме того, в зависимости от вашего варианта использования, ответ может быть «ни один».См. ручную запись о поведении оператора длины :
Если в массиве есть «дыры» (то есть, нулевые значения между другими ненулевыми значениями), тогда #t может быть любым из индексов, которые непосредственно предшествуют нулевому значению (то есть он может рассматривать любое такое нулевое значение как конец массива).
Таким образом, если вы имеете дело смассив с дырками, используя любой из них (table.insert
использует оператор длины ), может «добавить» ваше значение к более низкому индексу в массиве, чем вы хотите.Как вы определяете размер вашего массива в этом сценарии, зависит от вас, и, опять же, зависит от предпочтений и обстоятельств: вы можете использовать table.maxn
(исчезает в 5.2, но тривиально писать), вы можете оставить поле n
в таблице и обновите ее при необходимости, вы можете обернуть таблицу в метатаблицу или использовать другое решение, которое лучше соответствует вашей ситуации (в цикле часто бывает достаточно local tsize
в области видимости, находящейся вне цикла).