Slide 12 de 74

Laços

O laço de contagem
proc main(): void {
	for i := 0; i < 3; i++ {
		echo "quadro {i}"
	}
	for i := 10; i > 7; i-- {       // o contador é do próprio laço
		echo "contagem {i}"
	}

	// Qualquer cláusula pode ser omitida. Só com condição, é um laço while.
	mut left := 3
	for ; left > 0; {
		left -= 1
	}
	echo left
}
for each, break e continue
proc main(): void {
	for each name: Str in ["north", "", "south", "orchard"] {
		if name == "" {
			continue          // pula para o próximo
		}
		if name == "south" {
			break             // sai do laço por completo
		}
		echo name
	}
}

Existem dois laços.

O de contagem é for i := 0; i < 10; i++. Seu contador pertence ao laço — o próximo laço pode dar o mesmo nome ao seu contador — e é mutável sem dizer mut, embora ainda siga a regra do camelCase. Qualquer uma das três cláusulas pode ser omitida, que é como se escreve um laço while: for ; left > 0; { … }.

O de percorrer é for each name in values. Ele vincula cada elemento de um vetor a um name imutável, em ordem, e como nunca indexa, não precisa de prova de limites. for each name: T in values declara o tipo do elemento em vez de inferi-lo, e um tipo que os elementos não satisfazem é um erro de compilação. Uma Str e um mapa não são vetores, então nenhum dos dois pode ser percorrido assim: split(text, "") são os caracteres de uma string, e as chaves de um mapa aparecem no slide dele.

break sai do laço mais interno e continue pula para a próxima volta dele; qualquer um dos dois fora de um laço é um erro de compilação.