¿Cómo eliminar todos los elementos en una mesa de lua?
Pregunta
¿Cómo elimino todos los elementos dentro de una mesa de lua? No quiero hacer:
t = {}
table.insert(t, 1)
t = {} -- this assigns a new pointer to t
Quiero retener el mismo puntero a T, pero eliminar todos los elementos dentro t
.
Lo intenté:
t = {}
table.insert(t, 1)
for i,v in ipairs(t) do table.remove(t, i) end
¿Es válido lo anterior? ¿O se necesita algo más?
Solución
for k in pairs (t) do
t [k] = nil
end
También funcionará: puede tener dificultades con ipairs si la mesa no se usa como una matriz en todo momento.
Otros consejos
Elementos de tabla inserta y elimina el rendimiento comparado
El tamaño de la tabla cuenta 10000000
1] Mientras que el crudo
while #t ~= 0 do rawset(t, #t, nil) end
Pasado tiempo = 0.677220
2] Siguiente y RawSet
for k in next, t do rawset(t, k, nil) end
Pasado tiempo = 0.344533
3] ipairs y crudo
for i, v in ipairs(t) do t[i] = nil end
Pasado tiempo = 0.012450
4] Para el conjunto crudo
count = #t
for i=0, count do t[i]=nil end
Pasado tiempo = 0.009308
Inserto de elemnets de tabla
1] Función de inserción de tabla
for i=0, 10000000 do table.insert(t, i, i) end
Pasado tiempo = 1.0590489
2] usa #T
for i=0, 10000000 do t[#t+1] = i end
Pasado tiempo = 0.703731
3] Para el conjunto crudo
for i=0, 10000000 do rawset(t, i, i) end
Pasado tiempo = 0.100010
resultado.
Eliminación más rápida: 4
Inserto más rápido: 3
más fácil y más activo:
for k,v in pairs(tab) do tab[k]=nil end
Lo que sugieres no se puede usar: table.remove
cambia los elementos restantes para cerrar el agujero y, por lo tanto, arruina el recorrido de la mesa. Ver la descripción de la siguiente función para más información
Para una versión más rápida que ignora el __pairs
metamethod:
local next = next
local k = next(tab)
while k ~= nil do
tab[k] = nil
k = next(tab, k)
end
EDITAR: Como @Siffiejoe menciona en los comentarios, esto se puede simplificar nuevamente en un bucle para reemplazar el pairs
llamar con su valor de retorno predeterminado para tablas: el next
método y la tabla misma. Además, para evitar todos los metametodos, use el rawset
Método para la asignación de índice de tabla:
for k in next, tab do rawset(tab, k, nil) end
#table
es el tamaño de la tabla y así si t = {1,2,3}
después #t = 3
Para que pueda usar este código para eliminar los elementos
while #t ~= 0 do rawset(t, #t, nil) end
Pasará por la mesa y eliminará cada elemento y obtendrá una mesa vacía al final.