Wie entferne ich einen Lua-Tabelleneintrag anhand seines Schlüssels?

94

Ich habe eine Lua-Tabelle, die ich als Hashmap verwende, dh mit String-Schlüsseln:

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

Ich möchte ein Element dieser Tabelle "platzen" lassen, das durch seinen Schlüssel identifiziert wird. Es gibt eine table.remove()Methode, die jedoch nur den Index des zu entfernenden Elements (dh eine Zahl) und keinen generischen Schlüssel benötigt. Ich würde gerne dazu in der Lage sein table.remove(map, 'foo')und hier ist, wie ich es implementiert habe:

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

Gibt es einen besseren Weg, das zu tun?

Wookai
quelle
4
+1 auf die sehr nützliche Frage, weil Sie die "Antwort" gegeben haben, die ich brauchte; auch wenn es keinen "besseren" Weg gibt.
Ian Boyd

Antworten:

82

Nein, das Setzen des Schlüsselwerts auf nilist die akzeptierte Methode zum Entfernen eines Elements im Hashmap-Teil einer Tabelle. Was Sie tun, ist Standard. Ich würde jedoch empfehlen, nicht zu überschreiben. table.remove()Für den Array-Teil einer Tabelle umfasst die Standardfunktionalität table.remove () die Neunummerierung der Indizes, was bei Ihrer Überschreibung nicht der Fall wäre. Wenn Sie Ihre Funktion zum tableFunktionssatz hinzufügen möchten, würde ich sie wahrscheinlich so table.removekey()oder so nennen.

Bernstein
quelle
Vielen Dank für das Feedback zum Löschen. Über den Namen der Funktion diente dies hauptsächlich dazu, meinen Standpunkt klar zu machen. Normalerweise überschreibe ich Standardfunktionen nicht. Ich werde es definitiv nicht unter diesem Namen verwenden ( table.removekey()wäre auch meine beste Wahl).
Wookai
1
Wenn Sie es nur innerhalb eines einzelnen Blocks verwenden, sind Sie in Bezug auf die Leistung noch besser dran, indem Sie es stattdessen einfach zu einer lokalen Funktion machen (spart den Aufwand einer globalen Suche für jeden Aufruf). Ich importiere ziemlich oft table.insertund table.removein den lokalen Namespace, wenn ich sie häufig benutze, oft als so etwas wie tinsert()und tremove().
Amber
Danke für den Leistungstipp. Ich werde versuchen, die Funktionen, die ich häufig verwende, in den lokalen Namespace zu importieren, um festzustellen, ob dies einen großen Unterschied macht.
Wookai
Beachten Sie, dass Sie table.remove (indez, position) verwenden sollten, anstatt es auf nil zu setzen, damit die Indizes dekrementiert und daher die Elemente neu positioniert werden.
@HakanBoztepe Das ist nicht relevant für den Hashmap-Teil der Tabelle (String-Schlüssel).
Amber