Option: Some y None
Option<T> es la manera que tiene Nyx de expresar un valor que puede estar presente o no. En lugar de retornar un valor centinela como -1 o arriesgarse a un puntero nulo, las funciones retornan Option.Some(value) en caso de éxito u Option.None cuando no hay nada que retornar.
Código
// Option: función que retorna Some o None, match exhaustivo para manejar ambos
fn find_positive(nums: Array, index: int) -> Option<int> {
let val: int = nums[index]
if val > 0 {
return Option.Some(val)
}
return Option.None
}
fn describe(opt: Option<int>) -> String {
return match opt {
Option.Some(v) => "encontrado: " + int_to_string(v),
Option.None => "no encontrado"
}
}
fn main() -> int {
let nums: Array = [10, -5, 3, -1, 7]
// Caso Some: index 0 es positivo
let a: Option<int> = find_positive(nums, 0)
print(describe(a))
// Caso None: index 1 es negativo
let b: Option<int> = find_positive(nums, 1)
print(describe(b))
// if let para extraer el valor directamente
let c: Option<int> = find_positive(nums, 4)
if let Option.Some(v) = c {
print("if let Some: valor es " + int_to_string(v))
} else {
print("if let: ningun valor")
}
return 0
}
Salida
encontrado: 10 no encontrado if let Some: valor es 7
Explicación
Option<T> es un enum genérico con dos variantes: Option.Some(value) envuelve un valor existente de tipo T, y Option.None señala su ausencia. Como forma parte del prelude, no necesitás importarlo — siempre está disponible. Este patrón elimina toda una clase de bugs relacionados con nulos al hacer explícita la opcionalidad en el sistema de tipos.
La función describe muestra un match exhaustivo sobre un Option. El compilador exige que se manejen ambos casos — olvidarse de Option.None es un error en tiempo de compilación. El caso Some usa desestructuración de patrones para vincular el valor interno directamente a v, que luego queda disponible en la expresión de ese caso.
if let Option.Some(v) = c es un atajo conciso para cuando solo te interesa el caso Some y querés recurrir a una rama else para el caso None. Vincula v dentro del cuerpo del if sin la formalidad de una expresión match completa.