Bucles en Lua
SOLUCIONARIO
Bucles en Lua
2025-05-23
Por
Occam's Razor

#!/usr/bin/lua

a={}
for i = 0,10 do
    a[i] = i
end

for i = 0,10 do
    print (i, " -> ", a[i])
end

i = 10
while i > 0 do 
      i = i - 1;
      io.write (i .. " -> ".. a[i])
      if i > 4 then
         print (" **")
      else
         print ()   
      end
      if i == 1 then break end
end

i = 0
repeat
    print (i, "->", a[i])
    i = i + 1
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:

found = nil
a=(1,2,3,4,5,6,7,8,9,10}
for i=1,10 do
  if a[i] == value then
    found = i
    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 y repeat .. 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 utilizando goto.

SOBRE Occam's Razor
Somos una revista libre que intenta explicar de forma sencilla conceptos tecnológicos y científicos de los que no podemos escapar. Al final, todo es más fácil de lo que parece!

 
Tu publicidad aquí :)