В lua существует два способа добавления элемента в массив:
table.insert(t, i)
и
t[#t+1] = i
Что я должен использовать и почему?
В lua существует два способа добавления элемента в массив:
table.insert(t, i)
и
t[#t+1] = i
Что я должен использовать и почему?
Что нужно использовать, это вопрос предпочтений и обстоятельств: поскольку оператор длины #
был введен в версии 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
в области, непосредственно за пределами цикла).
Ниже приведена немного забавная сторона, но, возможно, с эстетикой. Несмотря на очевидные причины, по которым mytable: operation() не поставляется, как mystring: operation(), можно легко свернуть один собственный вариант и получить по желанию третью нотацию.
Table = {}
Table.__index = table
function Table.new()
local t = {}
setmetatable(t, Table)
return t
end
mytable = Table.new()
mytable:insert('Hello')
mytable:insert('World')
for _, s in ipairs(mytable) do
print(s)
end
insert
может вставить произвольно (как указано в его имени), по умолчанию он равен #t + 1
, где в качестве t[#t + 1] = i
всегда будет добавляться таблица (конец). см. раздел 5.5 в руководство lua.
'#' использует только индексированную таблицу ключей.
t = {1, 2 ,3 ,4, 5, x=1, y=2}
при превышении кода
print(#t) --> print 5 not 7
'#', когда не используется.
Если вы хотите использовать оператор "#", проверьте его на тип элементов таблицы.
Функция вставки может использоваться с любым типом use.But. Элемент count работает медленнее, чем '#'