Moe*_*ius 13 rust borrow-checker
这是我试图执行的代码:
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)));
}
Run Code Online (Sandbox Code Playgroud)
(在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
Run Code Online (Sandbox Code Playgroud)
我看到已经有很多关于借阅检查器问题的文档,但在阅读之后,我仍然无法弄清楚问题.
为什么这是一个错误,我该如何解决?
Vla*_*eev 16
Option::unwrap()使用该选项,即它按值接受选项.但是,您没有值,只有对它的引用.这就是错误所在.
你的代码应该像这样写:
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)));
}
Run Code Online (Sandbox Code Playgroud)
(在Rust操场上)
或者你可以Option像Shepmaster建议的那样使用像Option::as_ref或Option::as_mut配对的组合器Option::map_or:
fn my_fn(arg1: &Option<Box<i32>>) -> i32 {
arg1.as_ref().map_or(0, |n| **n)
}
Run Code Online (Sandbox Code Playgroud)
此代码使用i32可自动复制的事实.如果内部的类型Box不是Copy,那么你将无法通过值获取内部值 - 你只能克隆它或返回引用,例如,像这里:
fn my_fn2(arg1: &Option<Box<i32>>) -> &i32 {
arg1.as_ref().map_or(&0, |n| n)
}
Run Code Online (Sandbox Code Playgroud)
由于您只有对该选项的不可变引用,因此您只能返回对其内容的不可变引用.Rust非常智能,可以将文字提升0为静态值,以便在没有输入值的情况下能够返回它.