Suena como una pregunta de "déjame buscarlo en Google", pero de alguna manera no puedo encontrar una respuesta. El #
operador Lua solo cuenta las entradas con teclas enteras, y también lo hace table.getn
:
tbl = {}
tbl["test"] = 47
tbl[1] = 48
print(#tbl, table.getn(tbl)) -- prints "1 1"
count = 0
for _ in pairs(tbl) do count = count + 1 end
print(count) -- prints "2"
¿Cómo obtengo el número de todas las entradas sin contarlas?
dictionary[value] = #dictionary + 1
, donde#
representa el número de todos los objetos. Lo que me pregunto es por qué usted no desea que esto: en todos los cuerdo casos de uso de # (véase la respuesta por kaizer.se), el recuento de todos los objetos es exactamente igual a lo que ya # devuelve; parece que hacer que # cuente todo es estrictamente una mejora. Por supuesto que soy un novato de Lua y podría estar perdiendo el punto.#
operador está mal definido. Esto es fácilmente reparable: en primer lugar, hacer#
determinista y, en segundo lugar, introducir un nuevo operador o función para obtener el maldito recuento. Fin de la historia ... ¿Por qué tienen que ser tan tercos? :)Respuestas:
Ya tiene la solución en la pregunta: la única forma es iterar toda la tabla con
pairs(..)
.Además, observe que la definición del operador "#" es un poco más complicada que eso. Permítanme ilustrar eso tomando esta tabla:
Según el manual, cualquiera de los 3, 5 y 9 son resultados válidos para
#t
. La única forma sensata de usarlo es con matrices de una parte contigua sin valores nulos.fuente
#
no es determinista.According to the manual, any of 3, 5 and 9 are valid results for #t
. Según el manual, llamar a # en no secuencias es no definido . Eso significa que cualquier resultado (-1, 3, 3.14, 5, 9) es válido.Puede configurar una metatabla para rastrear el número de entradas, esto puede ser más rápido que la iteración si esta información es necesaria con frecuencia.
fuente
Hay una manera, pero puede ser decepcionante: use una variable adicional (o uno de los campos de la tabla) para almacenar el recuento y aumente cada vez que realice una inserción.
No hay otra manera, el operador # solo funcionará en tablas tipo matriz con claves consecutivas.
fuente
La forma más fácil que conozco para obtener el número de entradas en una tabla es con '#'. #tableName obtiene el número de entradas siempre que estén numeradas:
Lamentablemente, si no están numerados, no funcionará.
fuente
Podrías usar la biblioteca penlight . Esto tiene una función
size
que da el tamaño real de la tabla.Ha implementado muchas de las funciones que podemos necesitar al programar y faltar en Lua.
Aquí está la muestra para usarlo.
fuente
fuente
__newindex
solo llama cuando se define una nueva clave, por lo que no hay posibilidad de llamar__newindex
cuando establecemosnil
una clave existente.parece que cuando los elementos de la tabla se agregan mediante el método de inserción, getn volverá correctamente. De lo contrario, tenemos que contar todos los elementos
Imprimirá 2 correctamente
fuente