Rust Controle de fluxo Básico
Controle de fluxo
Em Rust, o controle de fluxo é uma expressão, não apenas um comando. Isso significa que if, match, loop e blocos podem retornar valores. Por exemplo, let x = if cond { 1 } else { 2 }; é perfeitamente válido. Essa característica torna o código mais conciso e expressivo.
Rust oferece três construções principais de repetição: loop (infinito), while (condicional) e for (iteração sobre coleções). O loop é especial porque pode ser interrompido com break seguido de um valor, permitindo que o loop produza um resultado. Já while e for não retornam valor diretamente.
Para loops aninhados, Rust permite labels (rótulos) para especificar qual loop deve ser interrompido ou continuado. A sintaxe é 'label: loop { ... break 'label; }. Isso evita o uso de flags booleanas complicadas.
Neste card, você vai praticar esses conceitos com exemplos práticos e exercícios que exploram desde o básico até situações que exigem labels e break com valor.
Pontos-chave
ifé uma expressão e pode ser usado para inicializar variáveis, desde que todos os braços retornem o mesmo tipo.loopé um laço infinito que pode ser quebrado combreak valorpara produzir um resultado.whilerepete enquanto uma condição for verdadeira;foritera sobre um iterador (ex.:0..5).- Labels (
'nome:) permitem controlar loops aninhados, especificando qualbreakoucontinueexecutar. - O
breakcom valor só é permitido emloop, não emwhileoufor.
fn main() {
// if como expressão
let idade = 20;
let categoria = if idade >= 18 { "adulto" } else { "menor" };
println!("Categoria: {}", categoria);
// loop com break retornando valor
let mut contador = 0;
let resultado = loop {
contador += 1;
if contador == 5 {
break contador * 2; // retorna 10
}
};
println!("Resultado do loop: {}", resultado);
// while
let mut n = 3;
while n > 0 {
println!("while: {}", n);
n -= 1;
}
// for
for i in 0..3 {
println!("for: {}", i);
}
// labels em loops aninhados
'externo: for i in 0..3 {
for j in 0..3 {
if i == 1 && j == 1 {
println!("Break no loop externo em i={}, j={}", i, j);
break 'externo;
}
println!("i={}, j={}", i, j);
}
}
}