2009-11-18 6 views
73

Ich habe eine lua-Tabelle, die ich als hashmap verwenden, dh mit String-Schlüsseln:Wie entferne ich einen Lua-Tabelleneintrag mit seinem Schlüssel?

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

ich zu „Pop“ ein Element dieser Tabelle durch seinen Schlüssel identifiziert möchte. Es gibt eine table.remove() Methode, aber es braucht nur den Index des zu entfernenden Elements (dh eine Zahl) und nicht einen generischen Schlüssel. Ich möchte in der Lage sein table.remove(map, 'foo') zu tun, und hier ist, wie ich es umgesetzt:

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

Gibt es einen besseren Weg, dies zu tun?

+4

+1 zu der sehr nützlichen Frage, weil Sie die "Antwort" gaben, die ich brauchte; auch wenn es keinen "besseren" Weg gibt. –

Antwort

64

Nein, das Festlegen des Schlüsselwerts auf nil ist die akzeptierte Methode zum Entfernen eines Elements im Hashmapp-Teil einer Tabelle. Was Sie tun, ist Standard. Ich würde jedoch empfehlen, nicht zu überschreiben table.remove() - für die Array-Teil einer Tabelle enthält die Standardfunktion table.remove() die Neunummerierung der Indizes, die Ihre Überschreibung nicht tun würde. Wenn Sie Ihre Funktion zu dem Funktionssatz table hinzufügen möchten, würde ich es wahrscheinlich so etwas wie table.removekey() oder etwas ähnliches nennen.

+0

Danke für die Rückmeldung über die Löschung. Über den Namen der Funktion war dies hauptsächlich, um meinen Standpunkt klarzustellen. Normalerweise überschreibe ich Standardfunktionen nicht. Ich werde es definitiv nicht unter diesem Namen verwenden ('table.removekey()' wäre auch meine beste Wahl). – Wookai

+0

Wenn Sie es nur in einem einzigen Block verwenden, sind Sie noch leistungsfähiger, indem Sie es einfach zu einer lokalen Funktion machen (spart den Overhead einer globalen Suche für jeden Aufruf). Ich importiere oft 'table.insert' und' table.remove' in den lokalen Namespace, wenn ich sie häufig benutze, oft als etwas wie 'tinsert() 'und' tremove() '. – Amber

+0

Danke für den Leistungstipp. Ich werde versuchen, die Funktionen, die ich häufig verwende, in den lokalen Namespace zu importieren, um zu sehen, ob dies einen großen Unterschied macht. – Wookai