Parece uma pergunta "deixe-me pesquisar no google por você", mas de alguma forma não consigo encontrar uma resposta. O #
operador Lua conta apenas entradas com chaves inteiras e o mesmo table.getn
:
tbl = {}
tbl["test"] = 47
tbl[1] = 48
print(#tbl, table.getn(tbl)) -- prints "1 1"
count = 0
for _ in pairs(tbl) do count = count + 1 end
print(count) -- prints "2"
Como obtenho o número de todas as entradas sem contá-las?
dictionary[value] = #dictionary + 1
, onde#
representa o número de todos os objetos. O que me pergunto é por que você não quer isso: em todos os casos de uso sãos para # (veja a resposta em kaizer.se), a contagem de todos os objetos é exatamente igual ao que # já retorna; parece que fazer # contar tudo é estritamente uma melhoria. Claro que sou novato em Lua e pode estar perdendo o objetivo.#
operador está mal definido. Isso é tão facilmente corrigível: primeiro, faça#
determinístico e, em segundo lugar, introduza um novo operador ou função para obter a contagem danada. Fim da história ... Por que eles têm que ser tão teimosos? :)Respostas:
Você já tem a solução na pergunta - a única maneira é iterar a tabela inteira
pairs(..)
.Além disso, observe que a definição do operador "#" é um pouco mais complicada do que isso. Deixe-me ilustrar isso, tomando esta tabela:
De acordo com o manual, qualquer um de 3, 5 e 9 são resultados válidos para
#t
. A única maneira sensata de usá-lo é com matrizes de uma parte contígua sem valores nulos.fonte
#
não é determinístico.According to the manual, any of 3, 5 and 9 are valid results for #t
. De acordo com o manual, chamar # em não-seqüências é indefinido . Isso significa que qualquer resultado (-1, 3, 3,14, 5, 9) é válido.Você pode configurar uma meta-tabela para rastrear o número de entradas; isso pode ser mais rápido que a iteração se essas informações forem necessárias com frequência.
fonte
Há uma maneira, mas pode ser decepcionante: use uma variável adicional (ou um dos campos da tabela) para armazenar a contagem e aumente sempre que fizer uma inserção.
Não há outra maneira, o operador # só funcionará em tabelas do tipo matriz com chaves consecutivas.
fonte
A maneira mais fácil que eu conheço para obter o número de entradas em uma tabela é com '#'. #tableName obtém o número de entradas, desde que numeradas:
Infelizmente, se eles não estiverem numerados, não funcionará.
fonte
Você poderia usar a biblioteca de penlight . Isso tem uma função
size
que fornece o tamanho real da tabela.Ele implementou muitas das funções que podemos precisar enquanto estiver programando e faltando em Lua.
Aqui está a amostra para usá-lo.
fonte
fonte
__newindex
chamar somente quando uma nova chave for definida; portanto, não haverá chance de chamar__newindex
quando definirmosnil
uma chave existente.parece que quando os elementos da tabela são adicionados pelo método insert, getn retornará corretamente. Caso contrário, temos que contar todos os elementos
Ele imprimirá 2 corretamente
fonte