Jak usunąć wpis tabeli Lua za pomocą jego klucza?

97

Mam tabelę lua, której używam jako hashmap, czyli z kluczami ciągów:

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

Chciałbym „wyskoczyć” z elementu tej tabeli identyfikowanego przez jego klucz. Istnieje table.remove()metoda, ale wymaga ona tylko indeksu elementu do usunięcia (tj. Liczby), a nie klucza ogólnego. Chciałbym móc to zrobić table.remove(map, 'foo')i oto jak to zaimplementowałem:

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

Czy jest lepszy sposób, aby to zrobić?

Wookai
źródło
4
+1 bardzo przydatnemu pytaniu, ponieważ udzieliłeś „odpowiedzi”, której potrzebowałem; nawet jeśli nie ma „lepszego” sposobu.
Ian Boyd,

Odpowiedzi:

84

Nie, ustawienie wartości klucza na niljest akceptowanym sposobem usuwania elementu z części tabeli zawierającej hashmap. To, co robisz, jest standardowe. Jednak table.remove()odradzałbym przesłonięcie - w przypadku tablicy tablicy, domyślna funkcja table.remove () obejmuje przenumerowanie indeksów, czego nie zrobiłby twój przesłonięcie. Jeśli chcesz dodać swoją funkcję do tablezestawu funkcji, prawdopodobnie nazwałbym ją coś podobnego table.removekey()lub podobnego .

Bursztyn
źródło
Dziękujemy za opinię o usunięciu. Jeśli chodzi o nazwę funkcji, chodziło głównie o wyjaśnienie mojej kwestii. Zwykle nie zastępuję standardowych funkcji. Na pewno nie użyję go pod tą nazwą ( table.removekey()to też mój najlepszy wybór).
Wookai,
1
Jeśli używasz go tylko w jednym bloku, będziesz jeszcze lepszy pod względem wydajności, po prostu ustawiając go jako funkcję lokalną (oszczędza narzut globalnego wyszukiwania dla każdego wywołania). Dość często importuję table.inserti table.removedo lokalnej przestrzeni nazw, jeśli często ich używam, często jako coś w rodzaju tinsert()i tremove().
Bursztyn
Dzięki za wskazówkę dotyczącą wydajności. Spróbuję zaimportować funkcje, których często używam, do lokalnej przestrzeni nazw, aby zobaczyć, czy robi to dużą różnicę.
Wookai
Zauważ, że powinieneś używać table.remove (indez, position) zamiast ustawiać ją na zero, aby indeksy zostały zmniejszone, a zatem elementy zostały przeniesione.
@HakanBoztepe To nie jest istotne dla części tabeli zawierającej hashmap (klucze ciągów).
Bursztyn