2009-11-18 21 views
73

hashmap olarak kullandığım bir lua tablosum var, yani string tuşları ile:Bir lua tablosu girişini anahtarıyla nasıl kaldırabilirsiniz?

local map = { foo = 1, bar = 2 } 

Bu tablonun anahtarıyla tanımlanan bir öğeyi "pop" etmek istiyorum. Bir table.remove() yöntemi vardır, ancak yalnızca öğenin indeksini kaldırmak için (yani bir sayı) ve genel bir anahtar değil. Xzx19 yapabilmeyi ve burada uygulamamı istiyorum:

function table.removekey(table, key) 
    local element = table[key] 
    table[key] = nil 
    return element 
end 

Bunu yapmanın daha iyi bir yolu var mı?

+4

+1 "cevabını" verdi çünkü ben gerekli; "Daha iyi" bir yol olmasa bile. –

cevap

64

Hayır, nil için anahtarın değeri ayarlayarak bir tablonun HashMap kısmında bir öğeyi kaldırma kabul yoludur. Yaptığın şey standart. Ancak, ben table.remove() geçersiz kılma değil tavsiye ederim - bir tablo dizisi kısmı için, varsayılan table.remove() işlevselliği geçersiz kılma yapmazdı endekslerini, yeniden numaralandırılması içerir. Eğer table fonksiyon kümesine sizin işlev eklemek istiyoruz, o zaman muhtemelen sistemi table.removekey() ya da bazı tür gibi bir isim olurdu. çok faydalı soruya

+0

Silme ile ilgili geribildirim için teşekkürler. Fonksiyonun adıyla ilgili olarak, bu benim esas amacımın netleşmesiydi. Genelde standart fonksiyonları geçersiz kılmaz. Bu isim altında kesinlikle kullanamayacağım ('table.removekey()' benim de en iyi seçimim olacak). Yalnızca tek bir blok içinde onu kullanıyorsanız – Wookai

+0

, sadece bunun yerine bir yerel işlev yaparak kapalı epeyce daha da iyi (her arama için küresel bir arama yükünü kaydeder). Sık sık, sıklıkla 'tinsert()' ve 'tremove()' gibi bir şey olarak kullanıyorum, 'table.insert' ve 'table.remove' yerel ad alanına içe aktarıyorum. – Amber

+0

Performans ipucu için teşekkürler. Bu, büyük bir fark yaratıp yaratmadığını görmek için sıklıkla kullandığım işlevleri yerel ad alanına aktarmaya çalışacağım. – Wookai

İlgili konular