Option<T> is Nyx's way of expressing a value that may or may not be present. Instead of returning a sentinel value like -1 or risking a null pointer, functions return Option.Some(value) on success or Option.None when there is nothing to return.
// 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 }
encontrado: 10 no encontrado if let Some: valor es 7
How it works
Option<T> is a generic enum with two variants: Option.Some(value) wraps an existing value of type T, and Option.None signals absence. Because it is part of the prelude, you do not need to import it — it is always available. This pattern eliminates an entire class of null-related bugs by making optionality explicit in the type system.
The describe function shows exhaustive match on an Option. The compiler requires both arms to be handled — forgetting Option.None is a compile-time error. The Some arm uses pattern destructuring to bind the inner value directly to v, which is then available in the arm's expression.
if let Option.Some(v) = c is a concise shorthand for when you only care about the Some case and want to fall through to an else branch for None. It binds v in the if-body without the ceremony of a full match expression.