Nyx con Ejemplos

Defer y Cleanup

defer programa un bloque de código para que se ejecute cuando la función que lo contiene retorna — sin importar cuál sentencia return se tome o si ocurre un error. Es la forma idiomática de garantizar la limpieza de recursos como manejadores de archivos, conexiones de red o locks.

Código

// defer: garantizar cleanup al salir del bloque, como file_close

fn main() -> int {
    let path: String = "/tmp/nyx_example_36.txt"
    let contenido: String = "Linea 1: Nyx defer example\nLinea 2: cleanup garantizado\n"

    // Escribir el archivo primero
    write_file(path, contenido)
    print("Archivo escrito: " + path)

    // Abrir el archivo con file_open
    let f: File = file_open(path, "r")

    // defer garantiza que file_close se ejecuta al salir,
    // sin importar si hay return temprano o error
    defer { file_close(f) }

    // Leer e imprimir el contenido
    let linea1: String = file_read_line(f)
    print("Leyendo: " + linea1)

    let linea2: String = file_read_line(f)
    print("Leyendo: " + linea2)

    print("El file_close se ejecutara automaticamente al salir")
    // file_close(f) es llamado aqui por defer

    return 0
}

Salida

Archivo escrito: /tmp/nyx_example_36.txt
Leyendo: Linea 1: Nyx defer example
Leyendo: Linea 2: cleanup garantizado
El file_close se ejecutara automaticamente al salir

Explicación

defer { file_close(f) } registra el bloque inmediatamente después de que el archivo se abre, pero el bloque en sí no se ejecuta hasta que la función está por retornar. Esto asegura que el archivo se cierre sin importar cómo la función termina — a través del return 0 normal, un retorno anticipado, o un error no capturado.

En Nyx, defer siempre requiere un bloque delimitado por { } — expresiones sueltas como defer file_close(f) no son válidas. Múltiples bloques diferidos en la misma función se ejecutan en orden inverso de registro (último en entrar, primero en salir), reflejando cómo funciona el desenrollado de la pila.

Este patrón está directamente inspirado en el defer de Go y elimina clases enteras de bugs de fuga de recursos que son comunes cuando la limpieza debe colocarse en cada punto de salida posible.

← Anterior Siguiente →

Source: examples/by-example/36-defer-cleanup.nx