При использовании выражения loop в блоке цикла loop выполняются повторно на каждой итерации цикла.
GIF-анимация убирающегося персонажа в Fortnite иллюстрирует применение цикла loop. GIF-анимация проигрывается до конца, а затем повторяется с начала, и действия игрока соответствуют выражениям в блоке цикла.
# GIF
loop:
DoCleanSweepEmote()Как и GIF-анимация, блок loop будет повторяться бесконечно, если цикл не будет прерван принудительно. Это называется бесконечным циклом.
В большинстве случае бесконечные циклы не нужны, поскольку они блокируют выполнение программы. Поэтому в Verse есть способы их завершения или приостановки.
Завершить: вы можете завершить цикл, выйдя из него с помощью break или
return.Приостановить: вы можете приостановить цикл, если он используется в выражении
async. Для получения подробной информации см. Обзор конкурентности.
Также можно выполнять обе операции в одном цикле. В следующем примере блок цикла повторяется до тех пор, пока генерируемое случайное число не окажется меньше двадцати.
loop:
# generate random number
RandomNumber : int = GetRandomInt(0, 100)
# check if random number is less than twenty
if (RandomNumber < 20):
# exit loop
breakСинтаксически это эквивалентно следующему коду:
expression0
loop:
expression-block
if (test-arg-block):
break
expression-block
expression2В отличие от некоторых других выражений управления потоком, выражение loop возвращает значение void, поэтому оно может не подойти в случаях, когда нужно, чтобы выражение возвращало результат. Если loop находится внутри функции, можно вернуть значение с помощью return, однако при этом вы выйдете не только из цикла, но и из функции.
Выражения с вложенным циклом
Вы можете вложить один цикл в другой. Иногда первый цикл называют внешним циклом, а второй — внутренним, или вложенным. При выполнении выражения break во внутреннем цикле программа выходит только из этого цикла.
В примере ниже внешний цикл выполняется до expression3, а затем выражение if после внутреннего цикла обеспечивает выход из цикла и снова могут выполниться expression1 и внутренний цикл.
expression0
# outer loop
loop:
expression1
# inner loop
loop:
expression2
if (test-arg-block0):
# exit inner loop
break