Tu problema es simple:
names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
print (names)
end
Este código primero declara una variable global llamada names
. Luego, inicias un bucle for. El bucle for declara una variable local que resulta que también se llama names
; el hecho de que una variable se haya definido previamente con names
es completamente irrelevante. Cualquier uso de names
dentro del bucle for se referirá al local , no al global.
El bucle for dice que se llamará a la parte interna del bucle con names = 1
, luego names = 2
y finalmente names = 3
. El bucle for declara un contador que cuenta desde el primer número hasta el último, y llamará al código interno una vez por cada valor que cuente.
Lo que realmente querías era algo como esto:
names = {'John', 'Joe', 'Steve'}
for nameCount = 1, 3 do
print (names[nameCount])
end
La sintaxis [] es la forma de acceder a los miembros de una tabla Lua. Las tablas Lua asignan "claves" a "valores". Su matriz crea automáticamente claves de tipo entero, que aumentan. Entonces, la clave asociada con "Joe" en la tabla es 2 (los índices Lua siempre comienzan en 1).
Por lo tanto, necesita un bucle for que cuente de 1 a 3, que obtiene. Utiliza la variable de recuento para acceder al elemento de la tabla.
Sin embargo, esto tiene un defecto. ¿Qué sucede si elimina uno de los elementos de la lista?
names = {'John', 'Joe'}
for nameCount = 1, 3 do
print (names[nameCount])
end
Ahora, obtenemos John Joe nil
, porque intentar acceder a valores de una tabla que no existe da como resultado nil
. Para evitar esto, debemos contar desde 1 hasta la longitud de la tabla:
names = {'John', 'Joe'}
for nameCount = 1, #names do
print (names[nameCount])
end
El #
es el operador de longitud. Funciona en tablas y cadenas, devolviendo la longitud de cualquiera. Ahora, no importa cuán grande o pequeño names
sea, esto siempre funcionará.
Sin embargo, hay una forma más conveniente de iterar a través de una matriz de elementos:
names = {'John', 'Joe', 'Steve'}
for i, name in ipairs(names) do
print (name)
end
ipairs
es una función estándar de Lua que itera sobre una lista. Este estilo de for
bucle, el iterador para bucle, utiliza este tipo de función de iterador. El i
valor es el índice de la entrada en la matriz. El name
valor es el valor en ese índice. Así que básicamente hace mucho trabajo duro para ti.