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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top