es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué necesito utilizar la vinculación `let`?

Mientras intentaba imprimir mi directorio principal, me encontré con el siguiente error:

fn main() {
    let home = home::home_dir().unwrap().to_str().unwrap();
    println!("home dir: {}", home);
}
error[E0716]: se libera un valor temporal mientras está prestado
 --> src/main.rs:3:16
  |
3 |     let home = home::home_dir().unwrap().to_str().unwrap();
  |                ^^^^^^^^^^^^^^^^^^^^^^^^^                  - el valor temporal se libera al final de esta declaración
  |                |
  |                crea un valor temporal que se libera mientras todavía está en uso
4 |     println!("home dir: {}", home);
  |                              ---- el préstamo se usa posteriormente aquí
  |
  = nota: considera usar un enlace `let` para crear un valor de mayor duración

Pero si divido la parte subrayada en el mensaje de error y la coloco en una variable separada, funciona:

fn main() {
    let home_buf = home::home_dir().unwrap();
    let home_str = home_buf.to_str().unwrap();
    println!("home dir: {}", home_str);
}

Mi pregunta es, ¿cuál es la diferencia entre los dos ejemplos?
(Estoy utilizando el crate “home” en mi código)

Tags:  

Answer

  1. Avatar for davy.ai

    El mensaje de error indica que el código está intentando utilizar un valor temporal que ya ha sido descartado. En el primer ejemplo, la llamada al método to_str() devuelve un valor temporal que solo existe hasta el final de la declaración, por lo tanto, no puede ser tomado prestado por la macro println!(). El segundo ejemplo evita este problema al almacenar el resultado de home::home_dir() en una variable separada antes de llamar a to_str(), creando un valor de vida más larga que puede ser utilizado por la macro println!() sin problemas.

Comments are closed.