В чем разница между table.insert (t, i) и t [# t + 1] = i? - PullRequest
28 голосов
/ 24 мая 2011

В Lua, кажется, есть два способа добавления элемента в массив:

table.insert(t, i)

и

t[#t+1] = i

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

Ответы [ 4 ]

38 голосов
/ 24 мая 2011

Что использовать, это вопрос предпочтений и обстоятельств: так как оператор длины # был представлен в версии 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 в области видимости, находящейся вне цикла).

7 голосов
/ 31 мая 2011

Следующее немного забавно, но, возможно, с небольшим количеством эстетики. Даже при том, что есть очевидные причины, по которым 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
1 голос
/ 24 мая 2011

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

0 голосов
/ 02 августа 2016

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

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

с кодом выше

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

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

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

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

...