Bezpiecznie usuwaj elementy z tabeli tablic podczas iteracji
To pytanie jest podobne do tegoJak mogę bezpiecznie iterować stół lua podczas usuwania kluczy ale wyraźnie inny.
streszczenieBiorąc pod uwagę tablicę Lua (tabela z kluczami, które są kolejnymi liczbami całkowitymi zaczynającymi się od1
), jaki jest najlepszy sposób iteracji tej tablicyi usuń niektóre wpisy, tak jak są widoczne?
Mam tablicę znaczników czasu w tabeli tablicy Lua. Wpisy są zawsze dodawane na końcu tablicy (przy użyciutable.insert
).
local timestampedEvents = {}
function addEvent( data )
table.insert( timestampedEvents, {getCurrentTime(),data} )
end
Od czasu do czasu muszę przeglądać tę tabelę (w kolejności) i przetwarzać i usuwać niektóre wpisy:
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
Niestety powyższy kod łamie iterację, pomijając niektóre wpisy. Czy istnieje lepszy (mniejszy typ, ale nadal bezpieczny) sposób, aby to zrobić niż ręczne przechodzenie indeksów:
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