Come eliminare tutti gli elementi in un tavolo Lua?
Domanda
Come si elimina tutti gli elementi all'interno di un tavolo Lua? Non voglio fare:
t = {}
table.insert(t, 1)
t = {} -- this assigns a new pointer to t
Voglio conservare lo stesso puntatore a T, ma eliminare tutti gli elementi all'interno t
.
Provai:
t = {}
table.insert(t, 1)
for i,v in ipairs(t) do table.remove(t, i) end
Quanto sopra è valido? O è necessario qualcos'altro?
Soluzione
for k in pairs (t) do
t [k] = nil
end
Funzionerà anche: potresti avere difficoltà con ipairs se il tavolo non viene utilizzato come array in tutto.
Altri suggerimenti
Elementi della tabella Inserisci e rimuovi le prestazioni Confronta
Il conteggio delle dimensioni della tabella 10000000
1] while e rawset
while #t ~= 0 do rawset(t, #t, nil) end
tempo trascorso = 0,677220
2] Next e Rawset
for k in next, t do rawset(t, k, nil) end
tempo trascorso = 0,344533
3] ipairs e rawset
for i, v in ipairs(t) do t[i] = nil end
tempo trascorso = 0,012450
4] per, rawset
count = #t
for i=0, count do t[i]=nil end
tempo trascorso = 0,009308
Table Elennits Insert
1] Funzione di inserimento della tabella
for i=0, 10000000 do table.insert(t, i, i) end
tempo trascorso = 1.0590489
2] Usa #t
for i=0, 10000000 do t[#t+1] = i end
tempo trascorso = 0,703731
3] per, rawset
for i=0, 10000000 do rawset(t, i, i) end
tempo trascorso = 0,100010
risultato.
Rimuovi più veloce: 4
Inserto più veloce: 3
più semplice e più performante:
for k,v in pairs(tab) do tab[k]=nil end
Ciò che suggerisci non è utilizzabile: table.remove
Sposta gli elementi rimanenti per chiudere il buco e così incasina il traversario del tavolo. Vedere la descrizione per la funzione successiva per maggiori informazioni
Per una versione più veloce che ignora il __pairs
metamethod:
local next = next
local k = next(tab)
while k ~= nil do
tab[k] = nil
k = next(tab, k)
end
Modifica: come menziona @siffiejoe nei commenti, questo può essere semplificato in un ciclo sostituendo il pairs
Chiama con il suo valore di restituzione predefinito per le tabelle: il next
Metodo e la tabella stessa. Inoltre, per evitare tutti i metametodi, usa il rawset
Metodo per l'assegnazione dell'indice della tabella:
for k in next, tab do rawset(tab, k, nil) end
#table
è la dimensione del tavolo e quindi se t = {1,2,3}
poi #t = 3
Quindi puoi utilizzare questo codice per rimuovere gli elementi
while #t ~= 0 do rawset(t, #t, nil) end
Passerai attraverso il tavolo e rimuoverai ogni elemento e otterrai una tabella vuota alla fine.