A forma mais eficiente para determinar se uma tabela Lua está vazio (não contém entradas)?
Pergunta
O que é a forma mais eficiente para determinar se uma tabela está vazia (isto é, atualmente contém nem valores de estilo gama nem valores de estilo 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, uma vez que só funciona com os valores de estilo da disposição em cima da mesa - assim #{test=2}
é indistinguível de #{}
porque ambos retorno 0. Além disso, note que a verificação se a variável de tabela é nil
não suficiente como eu não estou à procura de valores nulos, mas sim tabelas com 0 entradas (ou seja {}
).
Solução
Seu código é eficiente, mas errado. (Considere {[false]=0}
.) O código correto é
if next(myTable) == nil then
-- myTable is empty
end
Para a máxima eficiência, você vai querer next
se ligam a uma variável local, por exemplo,
...
local next = next
...
... if next(...) ...
Outras dicas
Uma possibilidade seria a de contar o número de elementos, usando a tecla metatable "newindex". Ao atribuir algo não nil
, incrementar o contador (o contador poderia viver na metatable também) e ao atribuir nil
, diminuir o contador.
Os testes para mesa vazia seria testar o balcão com 0.
Aqui está um ponteiro para metatable documentação
Eu gosto de sua solução, porém, e eu honestamente não posso supor que minha solução é mais rápido em geral.
Este é provavelmente o que você queria:
function table.empty (self)
for _, _ in pairs(self) do
return false
end
return true
end
a = { }
print(table.empty(a))
a["hi"] = 2
print(table.empty(a))
a["hi"] = nil
print(table.empty(a))
Output:
true
false
true
Eu sei que isso é velho, e eu poderia ser mal-entendido que você de alguma forma, mas você só quer a mesa para estar vazio, isto é, a menos que você está apenas verificando se ele é e você realmente não quer ou precisa que ele estar vazio, você pode limpá-la, basta recriá-lo, se não estou enganado. isso pode ser feito com o abaixo sintaxe.
yourtablename = {} -- this seems to work for me when I need to clear a table.
melhor evitar a avaliação de __eq em caso de sobrecarga.
if rawequal(next(myTable), nil) then
-- myTable is empty
end
ou
if type(next(myTable)) == "nil" then
-- myTable is empty
end
serpente tentativa, trabalho para me
serpent = require 'serpent'
function vtext(value)
return serpent.block(value, {comment=false})
end
myTable = {}
if type(myTable) == 'table' and vtext(myTable) == '{}' then
-- myTable is empty
end
Como sobre isso?
if endmyTable[1] == nil then
-- myTable is empty
end
Tente usar #
. Ele retorna todas as instâncias que estão em uma tabela. Se não há exemplos em uma mesa, em seguida, ele retorna 0
if #myTable==0 then
print('There is no instance in this table')
end