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.
// 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 }
ok: 85 err: no es positivo: -5 err: numero demasiado grande
Cómo funciona
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.