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.