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.