Pular para o conteúdo

Loop For

Existem duas formas de loop for, assim como no Lua. Uma numérica e uma genérica:

for i = 10, 20
print i
for k = 1, 15, 2 -- um passo opcional fornecido
print k
for key, value in pairs object
print key, value

Os operadores de slicing e * podem ser usados, assim como com compreensões:

for item in *items[2, 4]
print item

Uma sintaxe mais curta também está disponível para todas as variações quando o corpo é apenas uma linha:

for item in *items do print item
for j = 1, 10, 3 do print j

Um loop for também pode ser usado como expressão. A última instrução no corpo do loop for é convertida em expressão e anexada a uma tabela array acumuladora.

Dobrando cada número par:

doubled_evens = for i = 1, 20
if i % 2 == 0
i * 2
else
i

Além disso, os loops for suportam break com valores de retorno, permitindo que o próprio loop seja usado como expressão que sai antecipadamente com um resultado significativo. Expressões for suportam break com múltiplos valores.

Por exemplo, para encontrar o primeiro número maior que 10:

first_large = for n in *numbers
break n if n > 10

Esta sintaxe de break-com-valor permite padrões concisos e expressivos de busca ou saída antecipada diretamente em expressões de loop.

key, score = for k, v in pairs data
break k, v * 10 if k == "target"

Você também pode filtrar valores combinando a expressão do loop for com a instrução continue.

Loops for no final do corpo de uma função não são acumulados em uma tabela para valor de retorno (em vez disso, a função retornará nil). Uma instrução return explícita pode ser usada, ou o loop pode ser convertido em compreensão de lista.

func_a = -> for i = 1, 10 do print i
func_b = -> return for i = 1, 10 do i
print func_a! -- imprime nil
print func_b! -- imprime objeto table

Isso é feito para evitar a criação desnecessária de tabelas para funções que não precisam retornar os resultados do loop.

YueScriptCompilador

Carregando compilador…