Fluxo de controle

Condições e loops

let label = if value > 0 { 1 } else if value < 0 { -1 } else { 0 }

let mut index: usize = 0
while index < len(values) {
    index = index + 1
}

for item in values {
    consume_copy(item)
}

if é uma expressão. while e for suportam break e continue. for em intervalos, matrizes e fatias é reduzido para um loop index/length direto e livre de alocação. Elementos somente de movimentação requerem indexação explícita e tratamento de propriedade.

Partida e ADTs

enum Response {
    Ok(i64)
    Err(str)
}

fn status(value: Response) -> i64 {
    match value {
        Ok(code) => code
        Err(message) => -1
    }
}

Os braços de correspondência não têm vírgulas e devem ser exaustivos, a menos que o fluxo restante seja inacessível. Os padrões suportam literais, tuplas, estruturas, variantes, ligações, descarte e guardas. As cargas úteis somente de movimentação são transferidas somente quando um braço é selecionado; um padrão ou guarda com falha preserva o proprietário para armas posteriores.

Opções, resultados e ?

fn find(enabled: bool) -> ?i64 {
    if enabled { Some(42) } else { None }
}

fn forward(enabled: bool) -> ?i64 {
    let value = find(enabled)?
    Some(value)
}

? produz o present/success carga útil ou retorna a falha correspondente. A propagação do resultado pode alterar o tipo de sucesso, mas preserva o tipo de erro. Nenhuma alocação implícita ou clone ocorre. ? não pode cruzar um spawn limite.

Limpeza nas bordas do fluxo

Queda, return, breake continue execute o plano de limpeza verificado para proprietários ativos. Panic/trap/abort as bordas nunca se desenrolam e não fazem limpeza.