Ответ 1
for k in pairs (t) do
t [k] = nil
end
Будет также работать - у вас могут возникнуть трудности с ipairs, если таблица не используется в качестве массива.
Как удалить все элементы внутри таблицы Lua? Я не хочу делать:
t = {}
table.insert(t, 1)
t = {} -- this assigns a new pointer to t
Я хочу сохранить тот же указатель на t, но удалить все элементы в t
.
Я пробовал:
t = {}
table.insert(t, 1)
for i,v in ipairs(t) do table.remove(t, i) end
Является ли это выше допустимым? Или что-то еще нужно?
for k in pairs (t) do
t [k] = nil
end
Будет также работать - у вас могут возникнуть трудности с ipairs, если таблица не используется в качестве массива.
проще всего:
for k,v in pairs(tab) do tab[k]=nil end
То, что вы предлагаете, неприменимо: table.remove
сдвигает оставшиеся элементы, чтобы закрыть отверстие, и таким образом нарушает обход таблицы. См. Описание следующей функции для получения дополнительной информации
Элементы таблицы вставляют и удаляют сравнение производительности
Размер таблицы 10000000
[1] while и rawset
while #t ~= 0 do rawset(t, #t, nil) end
потраченное время = 0,677220
[2] next и rawset
for k in next, t do rawset(t, k, nil) end
потраченное время = 0,344533
[3] ipairs и rawset
for i, v in ipairs(t) do t[i] = nil end
потраченное время = 0,012450
[4] для, rawset
count = #t
for i=0, count do t[i]=nil end
потраченное время = 0,009308
Вставка табличных элементов
[1] функция вставки таблицы
for i=0, 10000000 do table.insert(t, i, i) end
потраченное время = 1.0590489
[2] используйте #t
for i=0, 10000000 do t[#t+1] = i end
потраченное время = 0.703731
[3] для, rawset
for i=0, 10000000 do rawset(t, i, i) end
потраченное время = 0.100010
результат.
Самый быстрый убрать: 4
Самая быстрая вставка: 3
Для более быстрой версии, которая игнорирует метатет __pairs
:
local next = next
local k = next(tab)
while k ~= nil do
tab[k] = nil
k = next(tab, k)
end
EDIT: Как замечает @siffiejoe в комментариях, это можно упростить обратно в цикл for, заменив вызов pairs
его значением возврата по умолчанию для таблиц: методом next
и самой таблицей. Кроме того, чтобы избежать всех метаметодов, используйте метод rawset
для назначения индекса таблицы:
for k in next, tab do rawset(tab, k, nil) end
#table
- размер таблицы, поэтому, если t = {1,2,3}
, то #t = 3
Таким образом, вы можете использовать этот код для удаления элементов
while #t ~= 0 do rawset(t, #t, nil) end
Вы пройдете через таблицу и удалите каждый элемент, и в конце вы получите пустую таблицу.