Безопасное удаление элементов из таблицы массива во время итерации
This question is similar to Как безопасно перебрать таблицу lua во время удаления ключей но заметно отличается.
SummaryДан массив Lua (таблица с ключами, которые являются последовательными целыми числами, начиная с1
), как лучше перебрать этот массивand delete some of the entries as they are seen?
У меня есть массив записей с метками времени в таблице массива Lua. Записи всегда добавляются в конец массива (используяtable.insert
).
local timestampedEvents = {}
function addEvent( data )
table.insert( timestampedEvents, {getCurrentTime(),data} )
end
Мне нужно время от времени проходить через эту таблицу (по порядку) и обрабатывать и удалять определенные записи:
function processEventsBefore( timestamp )
for i,stamp in ipairs( timestampedEvents ) do
if stamp[1] <= timestamp then
processEventData( stamp[2] )
table.remove( timestampedEvents, i )
end
end
end
К сожалению, приведенный выше код нарушает итерацию, пропуская некоторые записи. Есть ли лучший (менее печатающий, но все же безопасный) способ сделать это, чем вручную обходить индексы:
function processEventsBefore( timestamp )
local i = 1
while i <= #timestampedEvents do -- warning: do not cache the table length
local stamp = timestampedEvents[i]
if stamp[1] <= timestamp then
processEventData( stamp[2] )
table.remove( timestampedEvents, i )
else
i = i + 1
end
end
end