Flusso di controllo

Condizioni e cicli

let label = if value > 0 { 1 } elif 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 è un'espressione. while e for supportano break e continue. for su intervalli, array e sezioni si riduce a un loop index/length senza allocazione diretta. Gli elementi di solo spostamento richiedono un'indicizzazione esplicita e la gestione della proprietà.

Match e ADT

type response {
    ok(i64)
    error(str)
}

fn status(value: response) -> i64 {
    match value {
        ok(code) => code
        error(message) => -1
    }
}

I bracci di corrispondenza non hanno virgole e devono essere esaustivi a meno che il flusso rimanente non sia irraggiungibile. I modelli supportano valori letterali, tuple, strutture, varianti, associazioni, scarti e protezioni. I carichi utili di solo spostamento vengono trasferiti solo quando viene selezionato un braccio; un modello o una guardia falliti preservano il proprietario per le armi successive.

Opzioni, risultati e ?

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

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

? restituisce il present/success payload o restituisce l'errore corrispondente. La propagazione dei risultati può modificare il tipo di successo ma preserva il tipo di errore. Non si verifica alcuna allocazione o clonazione implicita. ? non può attraversare a spawn confine.

Pulitura sui bordi del flusso

Fallthrough, ret, break, e continue eseguire il piano di pulizia verificato per i proprietari viventi. Panic/trap/abort i bordi non si rilassano mai e non eseguono alcuna pulizia.