Qual é a maneira mais eficiente de determinar se uma tabela está vazia (ou seja, atualmente não contém valores de estilo de matriz nem valores de estilo de dict)?
Atualmente, estou usando next()
:
if not next(myTable) then
-- Table is empty
end
Existe uma maneira mais eficiente?
Nota: O #
operador não é suficiente aqui, pois ele opera apenas nos valores de estilo de matriz na tabela - portanto, #{test=2}
é indistinguível #{}
porque ambos retornam 0. Observe também que verificar se a variável da tabela é nil
não é suficiente, pois não estou procurando valores nulos, mas sim tabelas com 0 entradas (ou seja {}
).
false
não seria uma chave esperada, entãoif not
funcionou bem, mas provavelmente terei o hábito de compararnil
no futuro, apenas como um bom hábito. E sim, tenho vinculado funções de utilitário comuns a vars locais para aumentar a velocidade. Obrigado pela contribuição.local next
?local next
no bloco atual, ele o usará, então subirá para o próximo bloco e repetirá. Uma vez fora dos locais, ele só usará o Global Namespace. Esta é uma versão simplificada dele, mas no final, definitivamente significa a diferença em relação à velocidade do programa.Uma possibilidade seria contar o número de elementos, usando a chave "newindex" da metatabela. Ao atribuir algo diferente
nil
, aumente o contador (o contador também poderia residir na metatabela) e, ao atribuirnil
, diminua o contador.O teste de mesa vazia seria testar o contador com 0.
Aqui está um indicador para a documentação da metatabela
Eu gosto da sua solução e, honestamente, não posso presumir que minha solução seja mais rápida no geral.
fonte
nil
é atribuído, uma vez que __newindex não dispara se a chave já existe na tabela.__index
e__newindex
, armazenando os dados reais em uma tabela sombra e mantendo a tabela real vazia para que__index
seja invocada. Pensando em voz alta, suspeito que o custo elevado de cada consulta não pode valer a pena.Provavelmente é isso que você queria:
Resultado:
fonte
next()
é mais eficiente (e mais conciso) do que repetirpairs()
.pairs()
é essencialmente apenas usando anext()
técnica, mas com mais overhead.table
biblioteca padrão não é recomendado.melhor evitar a avaliação de __eq se estiver sobrecarregado.
ou
fonte
tente serpente, trabalhe para mim
fonte
Que tal agora ?
fonte
Eu sei que isso é antigo, e posso estar te entendendo mal de alguma forma, mas você só quer que a mesa esteja vazia, isto é, a menos que você esteja apenas verificando se ela está e você realmente não quer ou precisa que ela esteja vazia, você pode limpá-lo simplesmente recriando-o, a menos que eu esteja enganado. isso pode ser feito com a sintaxe abaixo.
fonte
Tente usar
#
. Ele retorna todas as instâncias que estão em uma tabela. Se não houver instâncias em uma tabela, ele retorna0
fonte
#
isso não é suficiente aqui e dá as razões; você poderia explicar por que isso contorna esses motivos?