2009-11-18 49 views
73

我有我作爲一個HashMap使用lua的表,即具有字符串鍵:如何通過鍵刪除lua表條目?

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

我想「啪」由它的鍵標識該表的元素。有一個table.remove()方法,但它只需要刪除元素的索引(即數字)而不是通用鍵。我想能夠做到table.remove(map, 'foo'),這裏是我是如何實現它:

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

有沒有更好的方式來做到這一點?

+4

+1對非常有用的問題,因爲你給了我需要的「答案」;即使沒有「更好」的方式。 – 2012-01-03 00:40:03

回答

64

不,將密鑰的值設置爲nil是刪除表的散列表部分中的項的可接受方式。你在做什麼是標準的。但是,我建議不要覆蓋table.remove() - 對於表的數組部分,默認的table.remove()功能包括對索引進行重新編號,這是您的重寫不會執行的。如果你想將你的函數添加到table函數集中,那麼我可能會將它命名爲table.removekey()等。

+0

感謝您對刪除的反饋。關於功能的名稱,這主要是爲了明確我的觀點。我通常不會覆蓋標準功能。我絕對不會在這個名字下使用它('table.removekey()'也是我的最佳選擇)。 – Wookai 2009-11-18 21:01:40

+0

如果你只在一個塊中使用它,只需簡單地將它作爲一個本地函數(節省每次調用的全局查找的開銷),就可以使性能更好。如果我經常使用它們,我經常將'table.insert'和'table.remove'導入到本地命名空間中,通常像'tinsert()'和'tremove()'這樣的東西。 – Amber 2009-11-18 23:00:56

+0

感謝您的性能提示。我將嘗試將我經常使用的函數導入到本地名稱空間中,以查看這是否會產生重大影響。 – Wookai 2009-11-19 20:26:39