Remova com segurança itens de uma tabela de matriz enquanto iterar
Esta questão é semelhante aComo posso iterar com segurança uma tabela de lua enquanto as chaves estão sendo removidas mas distintamente diferente.
ResumoDado um array Lua (tabela com chaves que são inteiros sequenciais a partir de1
), qual é a melhor maneira de percorrer este arraye excluir algumas das entradas como elas são vistas?
Eu tenho uma matriz de entradas com registro de data e hora em uma tabela de matriz Lua. As entradas são sempre adicionadas ao final da matriz (usandotable.insert
).
local timestampedEvents = {}
function addEvent( data )
table.insert( timestampedEvents, {getCurrentTime(),data} )
end
Eu preciso ocasionalmente percorrer esta tabela (em ordem) e processar e remover certas entradas:
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
Infelizmente, a abordagem acima do código interrompe a iteração, pulando algumas entradas. Existe alguma maneira melhor (menos de digitação, mas ainda segura) de fazer isso do que andar manualmente os índices:
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