El documento oficial lo describe así#de la siguiente manera: el operador de longitud se escribe como operador unario #. La longitud de una cadena es su número de bytes (es decir, la longitud de la cadena calculada como un carácter por byte).

La longitud de una tabla t se define como un índice entero n. Satisface que t[n] no es nil y t[n+1] es nil; además, si t

local tblTest2 =
{
    1,
    a = 2,
    3,
}

print(table.getn(tblTest2))

¿Cuál es el resultado de salida de este código? El resultado aquí debería ser2Primero, hay que entender que ctblTest2c no es una ctable simple, sino que mezcla dos estilos: lista (list) y registro (record). En la tabla,a = 2es de estilo record. Segundo, hay que entender que el record de estilo record no se cuenta en el cálculo de la longitud externa. Puedes imaginarlo como una función; igual que en otros lenguajes orientados a objetos, las funciones no se registran como variables internas.

Ya que es como una función, entonces se puede obtener el valor de a, sí.print(tblTest2.a)Eso es suficiente.

Mira el siguiente código:

local tblTest3 =
{
    1,
    {a = 2},
    3,
}

print(table.getn(tblTest3))

¿Cuál es el resultado de salida de este código? El resultado aquí debería ser3Hay que tener en cuenta que si una tabla está anidada en otra, la tabla anidada también es un elemento. Por lo tanto, el resultado de salida es3。

table.getn(t)equivalente a#t。

La siguiente situación es bastante enredada; puedes ir directamente a la última frase como resumen:

Ahora veamos una un poco más enredada:

local tblTest4 =
{
    1,
    nil,
}

print(table.getn(tblTest4))

¿Cuál es el resultado de salida de este código? Es 1. Todos sabemos que cuando una tabla obtiene su longitud, recorre toda la tabla y regresa en el último lugar no nil.

Pero, ¿y este código de abajo?

local tblTest5 =
{
    1,
    nil,
    2,
}

print(table.getn(tblTest5))

Salida 3, ¿divertido? Cuenta nil como un elemento en la longitud. Pero lo que te deja perplejo es este código:

local tblTest5 =
{
    1,
    nil,
    2,
    nil
}

Salida 1. Aquí va otro para dejarte totalmente confundido:

local tblTest5 =
{
    1,
    nil,
    2,
    nil,
    3,
    nil
}

Salida 3, ¿confundido? Mira de nuevo, este párrafo hará que nunca más te atrevas a escribir valores nil en una tabla:

local tblTest5 =
{
    1,
    nil,
    2,
    nil,
    3,
    nil,
    4,
    nil
}

Mira, el resultado de este párrafo es 1. Amigo, dime, ¿te atreverás a usar valores nil en una tabla de Lua en el futuro? Si sigues añadiendo nil más adelante, quizás descubras algo. Puede que creas que has encontrado una regla. Pero no debes pensar que es una regla. Porque es incorrecto.

  • 1. No uses nil en las tablas
  • 2. Si insistes en usar nil, debes usar la función table.setn() para establecer la longitud de la tabla. Nota: las versiones nuevas de Lua ya no soportan setn.

Tienes que recibir una conclusión:La función setn está obsoleta. No uses valores nil en las tablas de Lua. Si un elemento debe eliminarse, usa remove directamente, no lo reemplaces con nil.

Fuente: http://www.cnblogs.com/youxin/p/3799339.html