2009-11-18 11 views
73

Mam tabeli lua że używam jako hashmap, tj kluczy wyrażenie:Jak usunąć wpis tablicy lua za pomocą klucza?

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

chciałbym „pop” elementem tej tabeli identyfikowanej przez jej klucz. Istnieje metoda table.remove(), ale usuwa ona tylko indeks elementu (tj. Liczbę), a nie klucz ogólny. Chciałbym móc zrobić table.remove(map, 'foo') i oto jak I wdrożone go:

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

Czy istnieje lepszy sposób to zrobić?

+4

+1 do bardzo przydatnego pytania, ponieważ dałeś "odpowiedź", której potrzebowałem; nawet jeśli nie ma "lepszej" drogi. –

Odpowiedz

64

Nie, ustawienie wartości klucza na nil jest akceptowanym sposobem usuwania elementu w części mieszającej tabeli. To, co robisz, jest standardowe. Jednak zalecam, aby nie zastępować table.remove() - dla części tablicy tabeli, domyślna funkcja table.remove() obejmuje zmianę numeracji indeksów, których nie zastąpiłaby twoja korekta. Jeśli chcesz dodać swoją funkcję do zestawu funkcji table, to prawdopodobnie nazwałbym go czymś takim, jak table.removekey() lub innym podobnym.

+0

Dzięki za opinię na temat usunięcia. O nazwie tej funkcji, głównie po to, by jasno wyjaśnić. Zazwyczaj nie zastępuję standardowych funkcji. Zdecydowanie nie użyję go pod tą nazwą ('table.removekey()' również byłby moim najlepszym wyborem). – Wookai

+0

Jeśli używasz go tylko w jednym bloku, będziesz jeszcze lepszy pod względem wydajności, po prostu wykonując funkcję lokalną (oszczędzając narzut globalnego wyszukiwania dla każdego połączenia). Bardzo często importuję 'table.insert' i' table.remove' do lokalnej przestrzeni nazw, jeśli używam ich często, często jako coś takiego jak 'tinsert()' i 'tremove()'. – Amber

+0

Dzięki za porady dotyczące wydajności. Spróbuję zaimportować często używane funkcje do lokalnej przestrzeni nazw, aby sprawdzić, czy to robi dużą różnicę. – Wookai