Nyx con Ejemplos

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.

← Anterior Siguiente →

Source: examples/by-example/24-option-some-none.nx