Подтвердить что ты не робот

Какая разница между `table.insert(t, i)` и `t [# t + 1] = i`

В lua существует два способа добавления элемента в массив:

table.insert(t, i)

и

t[#t+1] = i

Что я должен использовать и почему?

4b9b3361

Ответ 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 в области, непосредственно за пределами цикла).

Ответ 2

Ниже приведена немного забавная сторона, но, возможно, с эстетикой. Несмотря на очевидные причины, по которым 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

Ответ 3

insert может вставить произвольно (как указано в его имени), по умолчанию он равен #t + 1, где в качестве t[#t + 1] = i всегда будет добавляться таблица (конец). см. раздел 5.5 в руководство lua.

Ответ 4

Оператор

'#' использует только индексированную таблицу ключей.

t = {1, 2 ,3 ,4, 5, x=1, y=2}

при превышении кода

print(#t)  --> print 5 not 7

'#', когда не используется.

Если вы хотите использовать оператор "#", проверьте его на тип элементов таблицы.

Функция вставки может использоваться с любым типом use.But. Элемент count работает медленнее, чем '#'