Этот вопрос похож на Как я могу безопасно перебирать таблицу lua во время удаления ключей, но явно отличается.
Резюме
Учитывая массив Lua (таблица с ключами, которые являются последовательными целыми числами, начиная с 1
), какой лучший способ выполнить итерацию через этот массив и удалить некоторые из записей по мере их просмотра?
Пример реального мира
У меня есть массив отмеченных временными записями в таблице массива 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