A forma mais eficiente para determinar se uma tabela Lua está vazio (não contém entradas)?

StackOverflow https://stackoverflow.com/questions/1252539

  •  12-09-2019
  •  | 
  •  

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 {}).

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top