¿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)
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 macroprintln!()
. El segundo ejemplo evita este problema al almacenar el resultado dehome::home_dir()
en una variable separada antes de llamar ato_str()
, creando un valor de vida más larga que puede ser utilizado por la macroprintln!()
sin problemas.