rust - No se puede salir del contenido prestado al desenvolver
borrow-checker (1)
Option::unwrap()
consume la opción, es decir, acepta la opción por valor.
Sin embargo, no tiene un valor, solo tiene una referencia a él.
De eso se trata el error.
Su código debe escribirse idiomáticamente de esta manera:
fn my_fn(arg1: &Option<Box<i32>>) -> i32 {
match arg1 {
Some(b) => **b,
None => 0,
}
}
fn main() {
let integer = 42;
my_fn(&Some(Box::new(integer)));
}
O puede usar combinadores de
Option
como
Option::as_ref
u
Option::as_mut
emparejado con
Option::map_or
, como ha sugerido Shepmaster:
fn my_fn(arg1: &Option<Box<i32>>) -> i32 {
arg1.as_ref().map_or(0, |n| **n)
}
Este código utiliza el hecho de que i32 se puede copiar automáticamente.
Si el tipo dentro del
Box
no fuera
Copy
, entonces no podría obtener el valor interno por valor, solo podría clonarlo o devolver una referencia, por ejemplo, como aquí:
fn my_fn2(arg1: &Option<Box<i32>>) -> &i32 {
arg1.as_ref().map_or(&0, |n| n)
}
Como solo tiene una referencia inmutable a la opción, solo puede devolver una referencia inmutable a su contenido.
Rust es lo suficientemente inteligente como para promover el
0
literal en un valor estático para mantenerlo y poder devolverlo en caso de ausencia del valor de entrada.
Este es el código que estoy tratando de ejecutar:
fn my_fn(arg1: &Option<Box<i32>>) -> (i32) {
if arg1.is_none() {
return 0;
}
let integer = arg1.unwrap();
*integer
}
fn main() {
let integer = 42;
my_fn(&Some(Box::new(integer)));
}
Obtuve el siguiente error:
error[E0507]: cannot move out of borrowed content
--> src/main.rs:5:19
|
5 | let integer = arg1.unwrap();
| ^^^^ cannot move out of borrowed content
Veo que ya hay mucha documentación sobre problemas con el verificador de préstamos, pero después de leerlo, todavía no puedo resolver el problema.
¿Por qué es un error y cómo lo resuelvo?