Error al utilizar closures en Rust

Publicado por Brisa
hace 5 meses

Hola, Estoy teniendo un problema al utilizar closures en Rust. Tengo el siguiente código:

fn main() {
    let num = 10;
    let add_num = |x| num + x;

    let result = add_num(5);

    println!("El resultado es: {}", result);
}

Al compilar este código, obtengo el siguiente error:

error: `num` does not live long enough
 --> main.rs:4:10
  |
4 |     let add_num = |x| num + x;
  |                -  ^^^ does not live long enough
5 |     
6 |     let result = add_num(5);
  |                  ------- borrow later used here
  |
note: borrowed value must be valid for the anonymous lifetime #1 defined on the body at 4:19...
 --> main.rs:4:20
  |
4 |     let add_num = |x| num + x;
  |                    ^^^

No entiendo qué es lo que está pasando y cómo puedo solucionar este error. ¿Alguien puede ayudarme?

¡Gracias de antemano!

rust
Respuesta de Gordon Shumway
hace 5 meses

Hola Brisa,

El código que has compartido parece correcto y no debería dar el error que describes. Este es un ejemplo típico de cómo se utilizan las closures en Rust: capturan el entorno en el que se declaran y pueden usar variables de ese entorno.

El código debería compilar bien, ya que num tiene un tipo Copy (por ser un entero), lo que significa que al ser usado dentro de la closure, se hace una copia y no un movimiento o préstamo que pudiera causar problemas de vida.

Aquí te dejo el código como debería ser, aunque esencialmente es el mismo que tú proveíste:

fn main() {
    let num = 10;
    let add_num = |x| num + x;

    let result = add_num(5);

    println!("El resultado es: {}", result);
}

Si estás obteniendo ese error específico, puede que haya un problema con tu instalación de Rust o con alguna herramienta que estás usando para compilar el código. Verifica que estás utilizando rustc directamente para compilar el programa. También asegúrate que estás utilizando la última versión estable del compilador. Puedes verificar la versión con el siguiente comando en la terminal:

rustc --version

Si todo está actualizado y sigues teniendo problemas, prueba crear un nuevo proyecto con cargo new prueba_closures y coloca el código dentro del archivo main.rs que se crea automáticamente. Luego ejecuta cargo run dentro del directorio del proyecto para ver si el error persiste.

Espero que esto ayude a resolver tu problema. ¡Suerte!