Como remover uma entrada de tabela lua por sua chave?

94

Eu tenho uma tabela lua que uso como um hashmap, ou seja, com chaves de string:

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

Eu gostaria de "estourar" um elemento desta tabela identificado por sua chave. Existe um table.remove()método, mas leva apenas o índice do elemento para remover (ou seja, um número) e não uma chave genérica. Eu gostaria de poder fazer table.remove(map, 'foo')e aqui está como implementei:

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

Existe uma maneira melhor de fazer isso?

Wookai
fonte
4
+1 para a pergunta muito útil porque você deu a "resposta" que eu precisava; mesmo que não haja uma maneira "melhor".
Ian Boyd

Respostas:

82

Não, definir o valor da chave como nilé a maneira aceita de remover um item na parte do hashmap de uma tabela. O que você está fazendo é padrão. No entanto, eu recomendo não substituir table.remove()- para a parte do array de uma tabela, a funcionalidade padrão table.remove () inclui renumerar os índices, o que sua substituição não faria. Se você quiser adicionar sua função ao tableconjunto de funções, provavelmente eu a nomearia como table.removekey()ou algo parecido .

Âmbar
fonte
Obrigado pelo feedback sobre a exclusão. Sobre o nome da função, isso foi principalmente para deixar meu ponto claro. Normalmente não anulo funções padrão. Definitivamente não o usarei com esse nome ( table.removekey()seria minha melhor escolha também).
Wookai
1
Se você estiver usando-o apenas em um único bloco, terá uma situação ainda melhor em termos de desempenho, simplesmente tornando-o uma função local (economiza a sobrecarga de uma pesquisa global para cada chamada). Eu muitas vezes importar table.inserte table.removeno namespace local se eu estou usando-los com freqüência, muitas vezes como algo como tinsert()e tremove().
Amber
Obrigado pela dica de desempenho. Tentarei importar as funções que uso com frequência para o namespace local para ver se isso faz uma grande diferença.
Wookai
Observe que você deve usar table.remove (indez, position) em vez de defini-lo como nil para que os índices sejam decrementados e, portanto, os elementos reposicionados.
@HakanBoztepe Isso não é relevante para a parte do hashmap da tabela (chaves de string).
Amber