Come rimuovere una voce della tabella lua con la sua chiave?


94

Ho una tabella lua che uso come hashmap, cioè con chiavi stringa:

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

Vorrei "pop" un elemento di questa tabella identificato dalla sua chiave. Esiste un table.remove()metodo, ma richiede solo l'indice dell'elemento da rimuovere (cioè un numero) e non una chiave generica. Vorrei poterlo fare table.remove(map, 'foo')ed ecco come l'ho implementato:

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

C'è un modo migliore per farlo?


4
+1 alla domanda molto utile perché hai dato la "risposta" di cui avevo bisogno; anche se non c'è un modo "migliore".
Ian Boyd

Risposte:


82

No, l'impostazione del valore della chiave su nilè il modo accettato di rimuovere un elemento nella porzione hashmap di una tabella. Quello che stai facendo è standard. Tuttavia, consiglierei di non sovrascrivere table.remove(): per la porzione di matrice di una tabella, la funzionalità predefinita table.remove () include la rinumerazione degli indici, cosa che non farebbe la sostituzione. Se vuoi aggiungere la tua funzione al tableset di funzioni, probabilmente la chiamerei qualcosa di simile table.removekey()o qualcosa di simile.


Grazie per il feedback sulla cancellazione. Riguardo al nome della funzione, questo era principalmente per chiarire il mio punto di vista. Di solito non sovrascrivo le funzioni standard. Sicuramente non lo userò con quel nome ( table.removekey()sarebbe anche la mia scelta migliore).
Wookai

1
Se lo stai usando solo all'interno di un singolo blocco, stai ancora meglio dal punto di vista delle prestazioni semplicemente rendendolo una funzione locale (risparmia il sovraccarico di una ricerca globale per ogni chiamata). Molto spesso importa table.inserte table.removenello spazio dei nomi locale se li uso frequentemente, spesso come qualcosa come tinsert()e tremove().
Amber

Grazie per il suggerimento sulle prestazioni. Cercherò di importare le funzioni che uso spesso nello spazio dei nomi locale per vedere se questo fa una grande differenza.
Wookai

Nota che dovresti usare table.remove (indez, position) invece di impostarlo a zero in modo che gli indici vengano decrementati e quindi gli elementi riposizionati.

@HakanBoztepe Questo non è rilevante per la parte hashmap della tabella (chiavi stringa).
Amber
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.