loops - for - lua array
¿Las ipairs son confiables en arreglos sin clasificar? (3)
Una mesa Lua no tiene orden.
Es simplemente un conjunto de claves no nil
, cada una asociada a un único valor no nil
.
Las implementaciones optimizan el almacenamiento de claves tipo "number" con valores enteros positivos que comienzan en 1 y finalizan en un punto en el que eligen, crean y reducen las estructuras internas con compensaciones de tiempo y memoria para las diversas operaciones de la tabla.
pairs
opera en todos los pares clave-valor en una tabla.
ipairs
opera en una secuencia conceptual de claves positivas con valores enteros contiguos con 1 y termina justo antes del primer valor nil
. Se ignoran otros pares clave-valor. Por lo tanto, su respuesta es "Sí, por diseño" siempre que coincida con su idea de "índice completo".
table.sort
hace lo mismo. Se ignoran otros pares clave-valor.
El operador de longitud de tabla predeterminado ( #
) es más restrictivo. Opera en tablas que tienen una "secuencia", que son tablas sin claves tipo "número" con valores enteros positivos (una secuencia vacía) o todas sus claves tipo "número" con valores enteros positivos son una secuencia contigua, comenzando en 1. Si usa el operador de longitud de tabla predeterminado en una secuencia no secuencial, obtiene un comportamiento indefinido.
Me pregunto si alguien puede confirmar si puede confiar en ipairs()
; devuelva todos los índices en orden, para una tabla con índice completo pero sin clasificar.
Tenemos un código en todo nuestro proyecto que clona tablas usando pairs()
, sin embargo, las matrices clonadas aparecen desordenadas. No estoy seguro si esto es un problema sin embargo.
Comparar:
A = {10, 20, 30, 40, 50, 60}
a:
B = {[1] = 10, [2] = 20, [3] = 30, [4] = 40, [5] = 50, [6] = 60}
Si buclea estos con pairs()
, el primero se ordena y el otro no. (En una nota al margen, B
se ordena de repente si haces un par de insertos traseros)
De vuelta a la pregunta original. Parece que B
arriba itera todos los valores en orden usando ipairs()
, pero ¿esto siempre está garantizado?
Sí, está garantizado que los ipairs
una tabla con claves enteras de 1
en orden. Si la tabla está ordenada no importa.
Del manual de referencia: ipairs
:
for i,v in ipairs(t) do body end
iterará sobre los pares (
1
,t[1]
), (2
,t[2]
), ..., hasta la primera clave entera ausente de la tabla.
Sí, lo hará.
ipairs()
del índice 1
a n
continuamente, y ipairs()
el primer índice que no es continuo.
Por ejemplo:
B = {[1] = 10, [2] = 20, [3] = 30, [4] = 40, [5] = 50, [6] = 60}
for i,v in ipairs(B) do
print(i,v)
end
will print:
1 10
2 20
3 30
4 40
5 50
6 60
Pero,
B = {[1] = 10, [2] = 20, [3] = 30, [5] = 40, [6] = 50, [7] = 60}
for i,v in ipairs(B) do
print(i,v)
end
will print
1 10
2 20
3 30
Porque 1,2,3
es continuo, pero se ipairs
en 4
, por lo que las ipairs
detienen.