Elimine de forma segura los elementos de una tabla de matriz mientras itera
Esta pregunta es similar a¿Cómo puedo iterar con seguridad una tabla lua mientras se eliminan las claves? pero claramente diferente.
ResumenDada una matriz Lua (tabla con claves que son enteros secuenciales que comienzan en1
), ¿cuál es la mejor manera de iterar a través de esta matrizy borre algunas de las entradas como se ven.?
Tengo una matriz de entradas con marca de tiempo en una tabla de matriz Lua. Las entradas siempre se agregan al final de la matriz (usandotable.insert
).
local timestampedEvents = {}
function addEvent( data )
table.insert( timestampedEvents, {getCurrentTime(),data} )
end
Necesito ejecutar ocasionalmente esta tabla (en orden) y procesar y eliminar ciertas 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
Desafortunadamente, el código anterior rompe la iteración, saltándose algunas entradas. ¿Hay alguna forma mejor (menos de escribir, pero todavía segura) de hacerlo que caminando manualmente los í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