Su problema es simple:
names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
print (names)
end
Este código declara una variable global primera llamada names
. Entonces, comienzas un ciclo for. El ciclo for declara una variable local que simplemente se llama names
también; el hecho de que una variable haya sido previamente definida 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 ciclo 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ía era algo como esto:
names = {'John', 'Joe', 'Steve'}
for nameCount = 1, 3 do
print (names[nameCount])
end
La sintaxis [] es cómo se accede 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 de Lua siempre comienzan en 1).
Por lo tanto, necesita un bucle for que cuenta del 1 al 3, lo que obtiene. Usas la variable de conteo 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
, debido a que intenta acceder a los valores de una tabla que no existen resultados en nil
. Para evitar esto, es necesario contar del 1 al 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 sea names
, esto siempre funcionará.
Sin embargo, hay una manera más conveniente para recorrer 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 del bucle for
, el iterador para el bucle, utiliza este tipo de función de iterador. El valor i
es el índice de la entrada en la matriz. El valor name
es el valor en ese índice. Por lo tanto, básicamente hace mucho trabajo para usted.
Excelente respuesta que no solo resuelve el problema sino que también explica cómo mejorarlo. – ChrisO
Entonces, con ipairs() funciona como foreach() en otros idiomas – boctulus
Gran respuesta, solo agregaría que en el ejemplo final es bastante habitual usar '_' cuando la var no se usa. p.ej. 'names = {'John', 'Joe', 'Steve'} para _, nombre en ipairs (nombres) do print (name) end' – Fraser