2011-02-02 35 views
21

Lua tablosundaki tüm öğeleri nasıl silebilirim? Yapmak istemiyorum:Lua tablosundaki tüm öğeleri nasıl silebilirsiniz?

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

ben t aynı işaretçi korumak, ancak t içindeki tüm unsurları silmek istiyorum.

Denedim:

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

yukarıdaki geçerli mi? Yoksa başka bir şeye ihtiyaç var mı?

+3

Durumun bir parametre olarak alarak bir işlevde bir tablo boşaltmak için sanırım. O zaman soru iyi bir şey, +1. İlk başta, c-kodunda bulunan ve Lua-kodunda belirtilmemiş olan "işaretçi" sözcüğü hakkında kafam karışmıştı. "Referans" veya bir şey demek istiyorsun. – AndersH

cevap

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

da çalışacak mı - masa boyunca bir dizi olarak kullanılmaz eğer ipairs zorluk olabilir.

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

EDIT: @siffiejoe yorumlardaki bahisler gibi, bu onun varsayılan pairs çağrı değiştirerek döngü için geri basitleştirilmiş olabilir __pairs metamethod yok sayar daha hızlı bir versiyonu için

13

en kolay ve etkili ve verimli: Eğer önermek ne

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

kullanışlı değildir: deliği kapatmak için kalan unsurları kaydırır ve böylece tablo geçişi karıştıran biridir table.remove. Daha fazla bilgi için the next function için açıklamaya bakın

3

tablolar için dönüş değeri: next yöntemi ve tablonun kendisi. Ayrıca, tüm metamethods önlemek için, masa indeksi atama için rawset yöntemi kullanın:

for k in next, tab do rawset(tab, k, nil) end 
+2

Ya da sadece bir sonraki k için sekme sekmesi [k] = nil biter – siffiejoe

0

#table masa büyüklüğünde ve böylece t = {1,2,3} eğer o #t = 3

Yani unsurları kaldırmak için bu kodu kullanabilirsiniz

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

Tablodan gidip her öğeyi kaldıracak ve sonunda boş bir tablo alacaksınız.

9

Tablo elemanları

Tablo boyutu sayısı 10000000

[1] ise ve =

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

harcanan zaman rawset takıp performansı karşılaştırma kaldırmak 0,677220

[2] bir sonraki ve parçalama

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

harcanan zaman = 0,344533

[3] ipairs ve rawset zaman = 0 geçirdi.012450

[4] için, 0,009308

Tablo elemnets

[1], tablo uç fonksiyonu

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

harcanan zaman = 1,0590489 eklemek =

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

harcanan zaman

rawset

[2]

0,703731 [3],

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

harcanan zaman

= 0,100010

sonucu rawset =

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

harcanan #t kullanımı.

En hızlı kaldırma: 4

En Hızlı insert: 3

İlgili konular