Obtendo o índice de entrada da tabela
Pergunta
Não consigo obter o índice de entrada da tabela.Eu preciso dele para remover um item da mesa.
eu uso table.insert
para adicionar entradas à tabela.
Outra pergunta:por que Lua não tem "sobrecarga" para funcionar table.remove para que se possa remover item por índice associativo?
Solução
t[k]=nil
remove de t
a entrada com chave k
.
Para a segunda pergunta, a resposta é que as tabelas podem ter metatabelas individuais.
Outras dicas
As tabelas implementam uma relação não ordenada entre chaves e valores. Em outras palavras, qualquer chave em particular (índice) só pode aparecer uma vez em uma tabela, mas um valor pode aparecer várias vezes.
Se você conhece a chave k
, então t[k] = nil
removerá a chave e o valor associado da tabela. No entanto, esta operação não tem efeito em outras chaves ou valores na tabela.
o table.insert
e table.remove
As funções operam com o conjunto de teclas inteiras seqüenciais a partir de 1, que são usadas por convenção para implementar matrizes ou listas. Para esse fim, eles manipulam outros valores na lista para impedir que a lista desenvolva buracos.
Uma maneira de encontrar uma chave na qual algum valor é encontrado é simplesmente pesquisar na tabela. Se isso for feito mais de uma vez, provavelmente é uma boa idéia criar uma segunda tabela que inverte os pares de chave/valor, para que a pesquisa por valor seja tão rápida quanto a pesquisa por índice.
Uma implementação adequada dependerá de suas suposições e necessidades. Algumas amostras são:
-- return the first integer index holding the value
function AnIndexOf(t,val)
for k,v in ipairs(t) do
if v == val then return k end
end
end
-- return any key holding the value
function AKeyOf(t,val)
for k,v in pairs(t) do
if v == val then return k end
end
end
-- return all keys holding the value
function AllKeysOf(t,val)
local s={}
for k,v in pairs(t) do
if v == val then s[#s+1] = k end
end
return s
end
-- invert a table so that each value is the key holding one key to that value
-- in the original table.
function Invert(t)
local i={}
for k,v in pairs(t) do
i[v] = k
end
return i
end