La mayoría forma eficaz de determinar si una tabla Lua está vacía (no contiene ninguna entrada)?

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

  •  12-09-2019
  •  | 
  •  

Pregunta

¿Cuál es la forma más eficaz de determinar si una tabla está vacía (es decir, actualmente no contiene ni valores de tipo matriz ni los valores de estilo dict)?

Actualmente, estoy usando next():

if not next(myTable) then
    -- Table is empty
end

¿Hay una manera más eficiente?

Nota: El operador # no es suficiente aquí, ya que sólo opera en los valores de tipo matriz en la mesa - por lo tanto #{test=2} es indistinguible de #{} porque tanto el retorno 0. Obsérvese también que comprobar si la variable de tabla es nil no lo hace suficiente como yo no busco a los valores nulos, sino más bien las tablas con 0 entradas (es decir {}).

¿Fue útil?

Solución

Su código es eficiente, pero mal. (Considere {[false]=0}.) El código correcto es

if next(myTable) == nil then
   -- myTable is empty
end

Para una máxima eficiencia que querrá unirse next a una variable local, por ejemplo,

...
local next = next 
...
... if next(...) ...

Otros consejos

Una posibilidad sería la de contar el número de elementos, mediante el uso de la tecla "newindex" metatabla. Al asignar algo no nil, incrementar el contador (el contador podría vivir en el metatabla también) y al asignar nil, disminuir el contador.

Las pruebas para mesa vacía sería probar el mostrador con 0.

Aquí hay un puntero a documentación metatabla

Me gusta su solución sin embargo, y sinceramente no puedo asumir que mi solución es más rápido en general.

Esto es probablemente lo que quería:

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))

Salida:

true
false
true

Sé que esto es viejo, y yo podría ser malentendido de alguna manera, pero es lo que desea que la tabla sea vacía, es decir, a menos que se acaba de comprobar si es y que en realidad no quieren o necesitan estar vacío, la puede eliminar simplemente volver a crearlo, si no me equivoco. esto se puede hacer con la sintaxis a continuación.

yourtablename = {} -- this seems to work for me when I need to clear a table.

mejor evitar la evaluación de __eq en caso de sobrecarga.

if rawequal(next(myTable), nil) then
   -- myTable is empty
end

o

if type(next(myTable)) == "nil" then
   -- myTable is empty
end

intento serpiente, trabajo para mí

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

¿Qué tal esto?

if endmyTable[1] == nil then
  -- myTable is empty
end

Trate de usar #. Devuelve todas las instancias que están en una tabla. Si no hay casos en una mesa, entonces se vuelve 0

if #myTable==0 then
print('There is no instance in this table')
end
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top