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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top