Controlar el flujo

Condiciones y bucles

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 es una expresión. while y for son compatibles con break y continue. for sobre rangos, matrices y cortes desciende a un bucle index/length sin asignación directa. Los elementos de solo movimiento requieren una indexación y un manejo de propiedad explícitos.

Partido y ADT

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

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

Los brazos de coincidencia no tienen comas y deben ser exhaustivos a menos que sea inalcanzable el flujo restante. Los patrones admiten literales, tuplas, estructuras, variantes, enlaces, descartes y guardias. Las cargas útiles de solo movimiento se transfieren solo cuando se selecciona un brazo; un patrón o guardia fallido preserva al propietario para armas posteriores.

Opciones, resultados y ?

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

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

? produce el present/success carga útil o devuelve el error correspondiente. La propagación de resultados puede cambiar el tipo de éxito pero conserva el tipo de error. No se produce ninguna asignación o clonación implícita. ? no puede cruzar un spawn límite.

Limpieza en bordes de flujo

caída, ret, break, y continue ejecutar el plan de limpieza verificado para propietarios vivos. Panic/trap/abort Los bordes nunca se desenrollan y no se limpian.