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.