Nyx con Ejemplos

Operador Try

El operador ? es azúcar sintáctica para propagar errores. Agregar ? a una expresión que retorna Result desempaqueta el valor Ok o retorna inmediatamente el Err al que llamó — sin necesidad de un match explícito.

Código

// Try operator (?): encadenar operaciones que pueden fallar, short-circuit en Err

enum Result {
    Ok(int),
    Err(String)
}

fn parse_positive(s: String) -> Result {
    let n: int = string_to_int(s)
    if n <= 0 {
        return Result.Err("no es positivo: " + s)
    }
    return Result.Ok(n)
}

fn double_it(n: int) -> Result {
    if n > 1000 {
        return Result.Err("numero demasiado grande")
    }
    return Result.Ok(n * 2)
}

// ? propaga el Err automáticamente sin match explícito
fn pipeline(s: String) -> Result {
    let n: int = parse_positive(s)?
    let d: int = double_it(n)?
    return Result.Ok(d + 1)
}

fn show(r: Result) {
    match r {
        Result.Ok(v)  => print("ok: " + int_to_string(v)),
        Result.Err(e) => print("err: " + e)
    }
}

fn main() -> int {
    show(pipeline("42"))     // ok: 85  (42*2+1)
    show(pipeline("-5"))     // err: no es positivo
    show(pipeline("2000"))   // err: numero demasiado grande

    return 0
}

Salida

ok: 85
err: no es positivo: -5
err: numero demasiado grande

Explicación

Sin ?, cada llamada que puede fallar requeriría una expresión match para revisar errores antes de continuar. El operador ? automatiza esto: si el resultado es Ok(v), desempaqueta v y continúa; si es Err(e), retorna inmediatamente Err(e) desde la función contenedora. La firma de la función también debe retornar un Result para que esto funcione.

La función pipeline encadena dos pasos que pueden fallar: parsear un entero positivo y duplicarlo dentro de un límite. Ambas líneas usan ?, así que el primer error encontrado corta el resto de la función. Cuando se pasa "-5", parse_positive retorna Err de inmediato y double_it nunca se llama.

Este patrón mantiene la lógica del camino feliz limpia y legible — pipeline se lee casi como código imperativo secuencial — a la vez que preserva un manejo de errores completo y explícito. Es el estilo preferido para operaciones de múltiples pasos en Nyx frente a expresiones match anidadas profundamente.

← Anterior Siguiente →

Source: examples/by-example/26-try-operator.nx