Не удается выйти из заемного контента при развертывании

Это код, который я пытаюсь выполнить:

fn my_fn(arg1: &Option<Box>) -> (i32) { if arg1.is_none() { return 0; } let integer = arg1.unwrap(); *integer } fn main() { let integer = 42; my_fn(&Some(Box::new(integer))); } 

( на площадке Rust )

Я получаю следующую ошибку:

 error[E0507]: cannot move out of borrowed content --> src/main.rs:5:19 | 5 | let integer = arg1.unwrap(); | ^^^^ cannot move out of borrowed content 

Я вижу, что уже есть много документации по вопросам проверки чеков, но после прочтения я все еще не могу понять проблему.

Почему это ошибка и как ее решить?

Option::unwrap() потребляет этот параметр, то есть принимает параметр по значению. Однако у вас нет значения, у вас есть только ссылка на него. Вот что такое ошибка.

Ваш код должен быть идиоматически написан следующим образом:

 fn my_fn(arg1: &Option>) -> i32 { match arg1 { Some(b) => **b, None => 0, } } fn main() { let integer = 42; my_fn(&Some(Box::new(integer))); } из них fn my_fn(arg1: &Option>) -> i32 { match arg1 { Some(b) => **b, None => 0, } } fn main() { let integer = 42; my_fn(&Some(Box::new(integer))); } 

( на площадке Rust )

Или вы можете использовать Option::as_ref Option такие как Option::as_ref или Option::as_mut паре с Option::map_or , поскольку Shepmaster предложил:

 fn my_fn(arg1: &Option>) -> i32 { arg1.as_ref().map_or(0, |n| **n) } 

Этот код использует тот факт, что i32 автоматически копируется. Если тип внутри « Box не был « Copy , то вы бы не смогли получить внутреннее значение по значению вообще – вы могли бы только клонировать его или возвращать ссылку, например, как здесь:

 fn my_fn2(arg1: &Option>) -> &i32 { arg1.as_ref().map_or(&0, |n| n) } 

Поскольку у вас есть только неизменяемая ссылка на этот параметр, вы можете вернуть неизменяемую ссылку на ее содержимое. Rust достаточно умен, чтобы продвинуть литерал 0 в статическое значение, чтобы сохранить его, чтобы вернуть его в случае отсутствия входного значения.

  • Println! error: ожидается, что аргумент literal / format должен быть строковым литералом
  • Почему связывание жизней имеет значение только с изменяемыми ссылками?
  • Условно перебрать один из нескольких возможных iteratorов
  • Как вы используете импорт родительского модуля в Rust?
  • Могу ли я делать интроспекцию типа с объектами признаков, а затем опускать ее?
  • Разрешены ли полиморфные переменные?
  • Как вы можете сделать безопасный статический синглтон в Rust?
  • Как избежать дублирования функций доступа для изменяемых и неизменных ссылок в Rust?
  • Передача изменчивой самостоятельной ссылки на метод принадлежащего ему объекта
  • В чем разница между iter и in_iter?
  • Инициализировать большой массив фиксированного размера с типами без копирования
  • Давайте будем гением компьютера.