rust borrow-checker

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))); }

( en el patio de Rust )

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))); }

( en el patio de Rust )

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?