web-dev-qa-db-fra.com

comment supprimer tous les éléments d'une table Lua?

Comment puis-je supprimer tous les éléments d'une table Lua? Je ne veux pas faire:

t = {}
table.insert(t, 1)
t = {}  -- this assigns a new pointer to t

Je veux conserver le même pointeur sur t, mais supprimer tous les éléments dans t.

J'ai essayé:

t = {}
table.insert(t, 1)
for i,v in ipairs(t) do table.remove(t, i) end

Ce qui précède est-il valide? Ou est-ce que quelque chose d'autre est nécessaire?

22
bob
for k in pairs (t) do
    t [k] = nil
end

Cela fonctionnera également - vous pouvez avoir des difficultés avec ipairs si la table n’est pas utilisée comme un tableau.

35
cbz

Les éléments de table insèrent et suppriment Performances comparent

Le nombre de tailles de table 10000000

[1] while et rawset

while #t ~= 0 do rawset(t, #t, nil) end

temps passé = 0.677220

[2] next et rawset

for k in next, t do rawset(t, k, nil) end

temps passé = 0,344533

[3] ipairs et rawset

for i, v in ipairs(t) do t[i] = nil end

temps passé = 0.012450

[4] pour, rawset

count = #t
for i=0, count do t[i]=nil end

temps passé = 0,009308

Insert de table elemnets 

[1] fonction d'insertion de table

for i=0, 10000000 do    table.insert(t, i, i) end

temps passé = 1.0590489

[2] utilise #t

for i=0, 10000000 do    t[#t+1] = i end

temps passé = 0,703731

[3] pour, rawset

for i=0, 10000000 do rawset(t, i, i) end

temps passé = 0.100010

résultat.

Retrait le plus rapide: 4

Insert le plus rapide: 3

14
gogothing

le plus simple et le plus performant:

for k,v in pairs(tab) do tab[k]=nil end

Ce que vous suggérez n'est pas utilisable: table.remove décale les éléments restants pour fermer le trou et gâche ainsi le parcours de la table. Voir la description de la fonction suivante pour plus d'informations

13
jpjacobs

Pour une version plus rapide qui ignore la métamethod __pairs:

local next = next
local k = next(tab)
while k ~= nil do
  tab[k] = nil
  k = next(tab, k)
end

EDIT: Comme @siffiejoe le mentionne dans les commentaires, cela peut être simplifié dans une boucle for en remplaçant l'appel pairs par sa valeur de retour par défaut pour tables: la méthode next et la table elle-même. De plus, pour éviter toutes les méthodes d'évaluation, utilisez la méthode rawset pour l'affectation d'index de table:

for k in next, tab do rawset(tab, k, nil) end
3
bonsaiviking

#table est la taille de la table et donc si t = {1,2,3} alors #t = 3

Vous pouvez donc utiliser ce code pour supprimer les éléments

while #t ~= 0 do rawset(t, #t, nil) end

Vous allez parcourir la table et supprimer chaque élément et vous obtenez une table vide à la fin.

0
gogothing