2009-11-18 12 views
73

Ho una tabella lua che uso come un HashMap, vale a dire con le chiavi stringa:Come rimuovere una voce della tabella lua tramite la sua chiave?

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

vorrei "pop" un elemento di questa tabella identificata dalla sua chiave. Esiste un metodo table.remove(), ma prende solo l'indice dell'elemento da rimuovere (cioè un numero) e non una chiave generica. Mi piacerebbe essere in grado di fare table.remove(map, 'foo') ed ecco come 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". –

risposta

64

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, raccomanderei di non sovrascrivere table.remove() - per la parte dell'array di una tabella, la funzionalità predefinita table.remove() include la rinumerazione degli indici, che la tua sovrascrittura non farebbe. Se vuoi aggiungere la tua funzione al set di funzioni table, allora probabilmente lo chiamerei qualcosa come table.removekey() o qualcosa del genere.

+0

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

+0

Se lo si utilizza solo all'interno di un singolo blocco, si migliora ulteriormente le prestazioni semplicemente impostandolo su una funzione locale (salva l'overhead di una ricerca globale per ogni chiamata). Importo molto spesso 'table.insert' e' table.remove' nello spazio dei nomi locale se li sto usando spesso, spesso come qualcosa come 'tinsert()' e 'tremove()'. – Amber

+0

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

Problemi correlati