2011-09-30 16 views
57

Mi tarea es cómo hacer un ciclo for. Lo he descubierto en términos de números, pero no puedo entenderlo en términos de nombres. Me gustaría crear un ciclo for que se ejecute en una lista de nombres. Lo que sigue es lo que tengo hasta ahora:Para Loop en Lua

names = {'John', 'Joe', 'Steve'} 
for names = 1, 3 do 
    print (names) 
end 

que han intentado algunas otras cosas, pero simplemente no funciona, el terminal siempre apenas menciona 1, 2, 3 ... lo que estoy haciendo mal?

Respuesta

144

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.

+4

Excelente respuesta que no solo resuelve el problema sino que también explica cómo mejorarlo. – ChrisO

+0

Entonces, con ipairs() funciona como foreach() en otros idiomas – boctulus

+4

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

11

Al leer en línea (tables tutorial) parece tablas se comportan como matrices por lo que está buscando:

WAY1

names = {'John', 'Joe', 'Steve'} 
for i = 1,3 do print(names[i]) end 

Way2

names = {'John', 'Joe', 'Steve'} 
for k,v in pairs(names) do print(v) end 

WAY1 utiliza la tabla index/key, en su mesa names cada elemento tiene una clave de partida de 1, por ejemplo:

names = {'John', 'Joe', 'Steve'} 
print(names[1]) -- prints John 

Así que acaba de hacer i van de 1 a 3.

En Way2 lugar que especifique qué tabla que desea ejecutar y asignar una variable por su clave y el valor, por ejemplo:

names = {'John', 'Joe', myKey="myValue" } 
for k,v in pairs(names) do print(k,v) end 

imprime el siguiente:

1 John 
2 Joe 
myKey myValue 
+5

Lees el tutorial de tablas, pero ¿no viste 'ipairs'? ¿O la parte donde 'pares 'no tiene que devolver los valores clave en un orden particular? –

+0

En realidad usé 'ipairs' al principio, pero cuando agregué el ejemplo' myKey = "myValue" 'que necesita' pairs' para la clave no numérica, decidí cambiar el resto para 'pairs' también. Perdón si omito que la orden no está garantizada con pares, pero dejé el enlace allí para que él lo lea. – derp

-1
names = {'John', 'Joe', 'Steve'} 
for names = 1, 3 do 
    print (names) 
end 
  1. va a eliminar su mesa y su sustitución por un int
  2. No está tirando de un valor de la tabla

Probar:

names = {'John','Joe','Steve'} 
for i = 1,3 do 
    print(names[i]) 
end 
+0

Downvoter: proporcione una razón * válida * para la votación negativa. Aunque creo que la respuesta es engañosa en el sentido de que 'names' (el contador de enteros) declarado en el ámbito' for' introduce una variable local, que sombrea los 'names' (la matriz de tablas) como se declara en el ámbito global. – Dejavu