Con la expresión loop, las expresiones del elemento block del bucle se repiten durante la iteración del bucle.
El siguiente GIF del gesto Barrido y cuenta nueva de Fortnite es un ejemplo de cómo funciona un loop. El GIF se reproduce hasta el final, luego se repite desde el principio, y el jugador que usa gestos es como las expresiones en un bloque loop.
# GIF
loop:
DoCleanSweepEmote()
Al igual que un GIF, un bloque loopse repetirá eternamente a menos que se le indique lo contrario. Es lo que se conoce como bucle infinito.
Los bucles infinitos no son muy útiles en la mayoría de los casos, ya que bloquearán el progreso del programa, por lo que Verse proporciona una forma de finalizar o suspender.
- Finalizar: Puedes finalizar un bucle saliendo con
breakoreturn. - Suspender: Puedes suspender un bucle si se utiliza en una expresión
async. Consulta Resumen de simultaneidad para obtener más información.
También es posible hacer ambas cosas en el mismo bucle. En este ejemplo, el bloque loopse repite hasta que el número aleatorio que se genera es inferior a veinte.
loop:
## Genera un número aleatorio.
RandomNumber : int = GetRandomInt(0, 100)
# Comprueba si el número aleatorio es menor que veinte.
if (RandomNumber < 20):
# Sal del bucle.
break
Sintácticamente, esto es lo mismo que:
expression0
loop:
expression-block
if (test-arg-block):
break
expression-block
expression2
A diferencia de otras expresiones de flujo de control, la expresión loop devuelve void, por lo que puede no ser útil en los casos en los que se desee que una expresión devuelva un resultado. Si el bucle está dentro de una función, entonces es posible devolver un valor con return, pero esto saldrá no solo del bucle sino también de la función.
Expresiones de bucle anidado
Puedes anidar un bucle dentro de otro bucle. El primer bucle se llama a veces bucle externo, y el segundo bucle se llama bucle interno. Cuando se ejecuta la expresión break en un bucle interno, solo se interrumpe fuera del bucle interno.
En el siguiente ejemplo, el bucle externo continúa hasta expression3, luego la expresión if después del bucle interno sale y puede ejecutar de nuevo expression1 y el bucle interno.
expression0
# Bucle externo
loop:
expression1
# Bucle interno
loop:
expression2
if (test-arg-block0):
# Salir del bucle interno
break
expression3
if (test-arg-block1):
# Salir del bucle externo
break
expression4