Fluxo de Controle
Rust fornece if/else, três formas de loop (loop, while, for) e match exaustivo. Loops e branches podem produzir valores quando usados como expressões.
Busque em todas as páginas da documentação
Rust fornece if/else, três formas de loop (loop, while, for) e match exaustivo. Loops e branches podem produzir valores quando usados como expressões.
fn sum_evens(nums: &[i32]) -> i32 {
let mut total = 0;
for &n in nums {
if n % 2 == 0 {
total += n;
}
}
total
}
fn first_negative(nums: &[i32]) -> Option<i32> {
for &n in nums {
if n < 0 {
return Some(n);
}
}
None
}Quando usar: Qualquer ramificação ou iteração. Prefira for em vez de while com índice manual ao iterar coleções.
fn find_pair(target: i32, nums: &[i32]) -> Option<(usize, usize)> {
'outer: for i in 0..nums.len() {
for j in (i + 1)..nums.len() {
if nums[i] + nums[j] == target {
break 'outer (i, j);
}
}
}
}
fn retry<F: FnMut() -> bool>(mut f: F, max: u32) -> bool {
let mut attempts = 0;
loop {
if f() {
break true;
}
attempts += 1;
if attempts >= max {
break false;
}
}
}
fn main() {
let nums = [2, 7, 11, 15];
println!("{:?}", find_pair(9, &nums));
println!("{}", retry(|| false, 3));
}O que isso demonstra:
break 'outer rotulado sai de loops aninhados com um valor de tuplaloop com break condicional implementa lógica de retentativa0..nums.len() para acesso baseado em índice quando necessárioOption para resultados ausentes em vez de valores sentinela| Construção | Uso |
|---|---|
for x in iter | Iterar coleções, intervalos, adaptadores |
while cond | Loop até a condição ser falsa |
loop | Loop infinito até break (pode retornar valor) |
let squares: Vec<i32> = (0..5).map(|n| n * n).collect();matchenum Color { Red, Green, Blue }
fn hex(c: Color) -> &'static str {
match c {
Color::Red => "#f00",
Color::Green => "#0f0",
Color::Blue => "#00f",
}
}Erros de compilador se uma variante estiver faltando. Use _ apenas quando você intencionalmente captura os casos restantes.
if let e while letlet Some(x) = opt else { return };
while let Some(line) = lines.next() {
println!("{line}");
}Correspondência parcial ergonômica sem match completo.
if não é bool - if 1 { } falha. Correção: Use comparações explícitas.0..n exclui n. Correção: Use 0..=n para fim inclusivo quando necessário.for - for item in &vec empresta; for item in vec move. Correção: Escolha iter(), iter_mut(), ou into_iter() deliberadamente.match não exaustivo - Adicionar variantes de enum quebra compilações. Correção: Trate como um recurso; atualize todos os match.break - Todos os break em um loop devem retornar o mesmo tipo. Correção: Anote ou unifique tipos.| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| Adaptadores de iterador | Transformar/filtrar sem loop explícito | Efeitos colaterais precisam de clareza sequencial |
Cadeia if let | Verificações de padrão único | Muitas variantes precisam de match |
Macro matches! | Predicado booleano em padrão | Você precisa de valores vinculados |
| Recursão | Estrutura de árvore/grafo | Pilhas profundas correm risco de estouro |
Sim. for x in &vec empresta elementos. for x in &mut vec empresta mutavelmente.
for (i, v) in items.iter().enumerate() é idiomático. 0..len bruto funciona quando vizinhos são necessários.
Em loop, break 42 faz a expressão do loop ser avaliada como 42.
Não. Apenas loop suporta break value. Use loop ou atribua dentro de while.
Pula para a próxima iteração do loop rotulado, como break rotulado.
match x { n if n > 0 => ..., _ => ... } adiciona uma condição booleana a um padrão.
Não. Use match para correspondência de padrões exaustiva.
Sim para inteiros e caracteres: 1..=5, 'a'..='z'.
Não em Rust. Use flags break ou valores de retorno Option em vez disso.
for (k, v) in &map ou map.iter(). A ordem é arbitrária, a menos que você use BTreeMap.
match detalhadosVersões da Pilha: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4, e Polars 0.46+.
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026