Primero veamos la parte de obtención de longitud del código fuente de la tabla de Lua (ltable.c)

j es la longitud de la parte del array. Primero se determina si la longitud del array es mayor que 0 y si el último elemento del array es nil; si es así, se usa la búsqueda binaria y se devuelve la longitud.

Si t->node es la parte hash de la tabla, y si está vacía, se devuelve la longitud del array.

Primer ejemplo:

En este caso, se inicializó la longitud del array; la longitud de t es 7. ¿Por qué? Porque el último elemento no es nil.

En el siguiente caso, la longitud de t es 5.

Segundo ejemplo:

Todos deberían saber que la longitud de t es 5.

En este caso, ¿cuánto mide t???

La respuesta es 2. ¿Por qué?

La inserción de t

t

Luego entrará en (lvm.c)

Luego llamará a la función luaH_newkey (ltable.c)

Luego llama a rehash

Aquí en realidad se calcula la parte del array y la parte que se coloca en el hash; nums es la distribución de las estadísticas numéricas. Si miras el código con atención, verás que la longitud del array es una potencia de 2 (2^n).

Aquí nil no es un número y no se incluye en las estadísticas, por lo que 1, 2, 5, 6 harán que la longitud del array sea 4; el resto se colocará en la parte de node.

La tabla está compuesta por una parte de array y una parte de hash de node.

Así, según la función que vimos antes, el cuarto elemento es nil, por lo que la longitud encontrada mediante la búsqueda binaria es 2.

Esto es un posible problema en los arrays de Lua si hay nil, aunque claro, solo es causado por el rehash.

Dirección original: https://www.cnblogs.com/wallini/p/4188499.html