2012-03-08 14 views
9

He insertado Lua en mi aplicación C, y estoy tratando de averiguar por qué una tabla creada en mi código C a través de:Lua table.getn() devuelve 0?

lua_createtable(L, 0, numObjects); 

y volvió a Lua, producirá un resultado de cero cuando llamo al siguientes:

print("Num entries", table.getn(data)) 

(Donde "datos" es la tabla creada por lua_createtable arriba)

Hay claramente los datos en la tabla, ya que puedo caminar por cada entrada (cadena: los datos de usuario) par a través de:

for key, val in pairs(data) do 
    ... 
end 

Pero ¿por qué table.getn (data) return zero? ¿Debo insertar algo en el meta de la tabla cuando lo creo con lua_createtable? He estado buscando ejemplos de uso de lua_createtable, y no he visto esto en ninguna parte ...

Respuesta

23

table.getn (que no se debe utilizar en Lua 5.1+. uso el operador de longitud #) devuelve la cantidad de elementos en la matriz de la tabla.

La parte de la matriz es cada tecla que comienza con el número 1 y aumenta hasta el primer valor que es nil (no presente). Si todas sus claves son cadenas, entonces el tamaño de la matriz de su tabla es 0.

+0

¿No hay una manera fácil de hacer lo que estoy tratando de hacer, entonces? - Obtener el número de elementos (pares de lectura) en la tabla que tengo sin iterar sobre él directamente? – jimt

+1

Puede hacer un seguimiento manual del tamaño de la tabla cada vez que cambie algo a la tabla y sobrecargar el meta-método '__len' para que el operador # devuelva ese valor. Por supuesto, este enfoque requiere mucha disciplina de codificación, olvídate de actualizar el valor del tamaño de la tabla y estás jodido. – ComicSansMS

+3

Es grosero decir "utilizar el operador de longitud #" y no mencionar un ejemplo. Lo que esta respuesta está diciendo es "Para obtener la longitud de una matriz A, escriba #A". Puede parecer trivial, pero es algo que echa a muchas personas y causa dudas, ya que no se puede asumir que un operador se comporta de la manera en que crees que lo hace hasta que hayas probado y te hayas acostumbrado. Sin embargo, votado a favor. – Dmitry

2

el operador # (y table.getn) devuelve el tamaño de la sección de la matriz (aunque cuando tiene una mesa llena de agujeros la semántica son más complejas)

no cuenta nada en la parte de hash de la tabla (por ejemplo, claves de cadena)

3

Aunque es costoso (O (n) frente a O (1) para listas simples), también puede agregar un método para contar los elementos de su mapa:

>> function table.map_length(t) 
    local c = 0 
    for k,v in pairs(t) do 
     c = c+1 
    end 
    return c 
end 

>> a = {spam="data1",egg='data2'} 
>> table.map_length(a) 
2 

Si usted tiene tales requisitos, y si su entorno le permite hacer lo que piensa acerca del uso de penlight que proporciona that kind of features y mucho más.

0
for k,v in pairs(tbl) do count = count + 1 end