Flux de contrôle

Conditions et boucles

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 est une expression. while et for prennent en charge break et continue. for sur les plages, les tableaux et les tranches descend à une boucle index/length directe sans allocation. Les éléments de déplacement uniquement nécessitent une indexation explicite et une gestion de la propriété.

Match et ADT

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

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

Les bras de correspondance n'ont pas de virgules et doivent être exhaustifs à moins que le flux restant ne soit inaccessible. Les modèles prennent en charge les littéraux, les tuples, les structures, les variantes, les liaisons, les rejets et les gardes. Les charges utiles de déplacement uniquement sont transférées uniquement lorsqu'un bras est sélectionné ; un modèle ou une garde défaillante préserve le propriétaire pour des armes ultérieures.

Options, résultats et ?

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

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

? donne le present/success payload ou renvoie l’échec correspondant. La propagation des résultats peut changer le type de réussite mais préserve le type d'erreur. Aucune allocation ou clonage implicite ne se produit. ? ne peut pas traverser un spawn frontière.

Nettoyage sur les bords du flux

Chute, ret, break, et continue exécuter le plan de nettoyage vérifié pour les propriétaires vivants. Panic/trap/abort les bords ne se déroulent jamais et n’effectuent aucun nettoyage.