Controlar el flujo

Condiciones y bucles

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 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

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

fn status(value: Response) -> i64 {
    match value {
        Ok(code) => code
        Err(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, return, break, y continue ejecutar el plan de limpieza verificado para propietarios vivos. Panic/trap/abort Los bordes nunca se desenrollan y no se limpian.