¿Cuál es la forma más eficiente de determinar si una tabla está vacía (es decir, actualmente no contiene ni valores de estilo de matriz ni valores de estilo dict)?
Actualmente, estoy usando next()
:
if not next(myTable) then
-- Table is empty
end
¿Existe una forma más eficiente?
Nota: El #
operador no es suficiente aquí, ya que solo opera en los valores de estilo de matriz en la tabla; por lo tanto, #{test=2}
es indistinguible de #{}
porque ambos devuelven 0. También tenga en cuenta que verificar si la variable de la tabla es nil
no es suficiente porque no estoy buscando valores nulos, sino tablas con 0 entradas (es decir {}
).
false
no sería una clave esperada, por lo queif not
funcionó bien, pero probablemente me acostumbré a compararnil
en el futuro, solo como un buen hábito. Y sí, he estado vinculando funciones de utilidad comunes a vars locales para mejorar la velocidad. Sin embargo, gracias por la entrada.local next
?local next
en el bloque actual, lo usará, luego subirá al siguiente bloque y repetirá. Una vez fuera de los locales, solo usará el espacio de nombres global. Esta es una versión simplificada, pero al final, definitivamente significa la diferencia en lo que respecta a la velocidad del programa.Una posibilidad sería contar el número de elementos, utilizando la clave de metatabla "newindex". Cuando asigne algo que no
nil
, incremente el contador (el contador también podría vivir en la metatabla) y cuando asignenil
, decremente el contador.Probar una tabla vacía sería probar el contador con 0.
Aquí hay un puntero a la documentación de metatabla
Sin embargo, me gusta tu solución y, sinceramente, no puedo asumir que mi solución sea más rápida en general.
fuente
nil
se asigna, ya que __newindex no se activa si la clave ya existe en la tabla.__index
y__newindex
, almacenando los datos reales en una tabla sombra y manteniendo la tabla real vacía para que__index
se invoque. Pensando en voz alta, sospecho que el costo elevado de cada búsqueda no puede valer la pena.Probablemente esto es lo que querías:
Salida:
fuente
next()
es más eficiente (y más conciso) que recorrer en buclepairs()
.pairs()
es básicamente usar lanext()
técnica, pero con más gastos generales.table
no se recomienda escribir en la biblioteca estándar .mejor evitar la evaluación de __eq si está sobrecargado.
o
fuente
prueba serpiente, trabaja para mi
fuente
Qué tal esto ?
fuente
Sé que esto es antiguo y podría malinterpretarlo de alguna manera, pero si solo desea que la mesa esté vacía, es decir, a menos que solo esté verificando si lo está y en realidad no quiere o necesita que esté vacía, puede borrarlo simplemente recreándolo, a menos que me equivoque. esto se puede hacer con la siguiente sintaxis.
fuente
Intente usar
#
. Devuelve todas las instancias que están en una tabla. Si no hay instancias en una tabla, devuelve0
fuente
#
eso no será suficiente aquí, y explica por qué; ¿Podría explicar por qué esto evita esas razones?