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

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

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 в статическое значение, чтобы сохранить его, чтобы вернуть его в случае отсутствия входного значения.

  • Могу ли я написать Итератор, который сам мутирует, а затем дает ссылку на себя?
  • Как мне взять RefCell , найти ключ и вернуть ссылку на результат?
  • Как я могу собрать в массив?
  • Можно ли управлять размером массива с помощью параметра типа общего?
  • Передача изменчивой самостоятельной ссылки на метод принадлежащего ему объекта
  • Как проверить равенство между объектами признаков?
  • Как инициализировать поля структуры, которые ссылаются друг на друга
  • Почему не рекомендуется принимать ссылку на String (& String), Vec (& Vec) или Box (& Box) в качестве аргумента функции?
  • Каков тип возврата операции индексирования?
  • Как создать глобальный, изменяемый синглтон?
  • Печатает! заимствовать или владеть переменной?
  • Interesting Posts

    Ошибка: XDG_RUNTIME_DIR не установлен в среде. Gtk-WARNING **: невозможно открыть дисплей:

    Программа для подключения видео TS с использованием командной строки

    Как установить компоненты cygwin из командной строки?

    Некоторые значки, прикрепленные к панели задач, дублируются при запуске экземпляра приложения

    Есть ли способ установить свойства на экземплярах структуры с помощью отражения?

    Как получить счетчик ссылок NSObject?

    Как выполнить долговременную задачу в ASP.NET 4?

    Как вставить новую строку в Excel с клавиатуры?

    Не удалось создать приложение com.android.tools.fd.runtime.BootstrapApplication?

    Как декодировать параметр URL с помощью C #?

    Как я могу создать FLAC + cue из нескольких файлов FLAC?

    Как восстановить поврежденную базу данных SQLite3?

    Является ли модификация строковых литералов неопределенным поведением в соответствии со стандартом C89?

    java.lang.ClassNotFoundException: sun.jdbc.odbc.JdbcOdbcDriver Исключение. Зачем?

    React router изменяет URL, но не просматривает

    Давайте будем гением компьютера.