#!/usr/bin/lua
={}
afor i = 0,10 do
[i] = i
aend
for i = 0,10 do
print (i, " -> ", a[i])
end
= 10
i while i > 0 do
= i - 1;
i io.write (i .. " -> ".. a[i])
if i > 4 then
print (" **")
else
print ()
end
if i == 1 then break end
end
= 0
i repeat
print (i, "->", a[i])
= i + 1
i until i == 10
for key,value in pairs (a) do
print (key.."->".. value)
end
Lua ofrece el paquete estándar para bucles. Bucles for
,
while
y repeat.. until
. Los bucles
for
exponen una sintaxis más compacta que en otros
lenguajes, permitiéndonos especificar los tres parámetros típicos (valor
inicial, valor final e incremento) uno tras otro simplemente separados
por comas.
Lua ofrece un comando break
, pero no un
continue
. Este último comando se puede simular utilizando
una etiqueta y la instrucción goto
:
for i = 0,10 do
if i > 5 and i < 8 then goto continue end
print (i)
::continue::
end
El código anterior contará hasta 10, pero no mostrará los valores
6
y 7
. Como podemos ver la funcionalida está
pero es un poco más engorrosa de utilizar.
SABÍAS QUE?
Aunque en el programa de ejemplo hemos indexado los arrays comenzando en cero por similitud a todos los otros lenguajes de los que estamos hablando y, aunque como podéis ver no hay problema en comenzar el indexado en 0, el convenio en Lua es comenzar en 1. Así todas las librería Lua usan este convenio.
Cuando usamos for
para iterar sobre números, como en los
ejemplos anteriores, hay una serie de particularidades que debemos
conocer.
La primera es que las tres expresiones que definen los valores del
bucle for
se evaluan una sola vez antes de iniciar el
bucle. Cuando definimos los bucles for
en nuestros ejemplos
hemos utilizado valores numéricos, pero nada nos impide utilizar otro
tipo de expresiones como por ejemplo:
for i = 0, get_max() do print (i) end
En este ejemplo, la función get_max
se ejecutará una
única vez antes de iniciar el bucle y el valor retornado será el que se
use como valor máximo.
La segunda es que la variable de control (i
en el
ejemplo anterior) es local al bucle y solo se puede utilizar en el
bloque do ... end
. Si necesitas el valor de la variable de
control fuera del bucle (quizás porque abandones el bucle con una
instrucción break
) debes asignarlo a otra variable visible
en la parte del código que te interesa:
= nil
found =(1,2,3,4,5,6,7,8,9,10}
afor i=1,10 do
if a[i] == value then
= i
found break
end
end
print (found)
print (i)
El código anterior imprimirá el índice buscado y a continuación
nil
, puesto que la variable i
no está definida
fuera del bloque del bucle.
Por último, nunca deberías cambiar el valor de la variable de control dentro del bucle ya que los resultados son impredecibles.
También ofrece una forma de for
que nos facilita iterar
a través de arrays (de tablas en general), para ello nos proporciona la
función pairs
para iterar sobre tablas en general.
SABÍAS QUE
Si solo necesitas el valor de tu tabla o array, puedes ahorrar una variable sustituyendo la clave por el carácter
_
.for _,val in pairs (a) do print (val) end
Si bien pairs
funciona sobre arrays como acabamos de
ver, Lua nos proporciona una función ipairs
especifica para
arrays, en concreto para iterar estructuras con formato indice,
valor. Si ejecutáis el programa anterior veréis un elemento extra
con clave 0 y valor 0. Este no se mostrará si utilizáis la función
ipair
.
Podemos escribir bucles infinitos en Lua de la siguiente forma:
while true do
-- Repite para siempre
end
repeat
-- Repite para siempre
until false
::infinito
-- Repite para siempre
goto infinito
Resumen
- Lua ofrece bucles
for
,while
yrepeat .. until
. - Lua ofrece una forma de
for
para recorrer tablas. - Lua ofrece la palabra clave
break
para romper el bucle. - Lua no ofrece la palabra clave
continue
. Se puede simular utilizandogoto
.
■