Rust 展开时无法移出共享引用后面的值

Rust 展开时无法移出共享引用后面的值,rust,borrow-checker,Rust,Borrow Checker,这是我试图执行的代码: fn my\u fn(arg1:&Option)->i32{ 如果arg1.is_none(){ 返回0; } 设整数=arg1.unwrap(); *整数 } fn main(){ 设整数=42; my_fn(&Some(Box::new(integer)); } () 我在Rust的早期版本中遇到以下错误: 错误[E0507]:无法移出借用的内容 -->src/main.rs:5:19 | 5 |让整数=arg1.unwrap(); |^^^^无法移出借用的内容

这是我试图执行的代码:

fn my\u fn(arg1:&Option)->i32{
如果arg1.is_none(){
返回0;
}
设整数=arg1.unwrap();
*整数
}
fn main(){
设整数=42;
my_fn(&Some(Box::new(integer));
}
()

我在Rust的早期版本中遇到以下错误:

错误[E0507]:无法移出借用的内容
-->src/main.rs:5:19
|
5 |让整数=arg1.unwrap();
|^^^^无法移出借用的内容
在更现代的版本中:

error[E0507]:无法移出共享引用后面的“*arg1”
-->src/main.rs:5:19
|
5 |让整数=arg1.unwrap();
|                   ^^^^
|                   |
|发生移动是因为“*arg1”的类型为“std::option::option”,而该类型未实现“Copy”特性
帮助:考虑借用“选项”的内容:'ARG1.asyRead()
我看到已经有很多关于借阅检查器问题的文档,但是在阅读之后,我仍然无法找出问题所在

为什么这是一个错误?我该如何解决它?

使用该选项,即它按值接受该选项。但是,您没有值,只有对它的引用。这就是错误所在

您的代码应该按照如下方式编写:

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)));
}
此代码使用的事实是,
i32
可自动复制。如果
中的类型不是
复制
,则您将无法按值获取内部值-您将只能克隆它或返回引用,例如,如下所示:

fn my_fn2(arg1: &Option<Box<i32>>) -> &i32 {
    arg1.as_ref().map_or(&0, |n| n)
}
fn my_fn2(arg1:&Option)->&i32{
arg1.as_ref().map_或(&0,| n | n)
}
由于您只有对该选项的不可变引用,因此只能返回对其内容的不可变引用。Rust足够聪明,可以将文本
0
提升为一个要保留的静态值,以便在没有输入值的情况下能够返回该值。

使用该选项,即它按值接受该选项。但是,您没有值,只有对它的引用。这就是错误所在

您的代码应该按照如下方式编写:

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)));
}
此代码使用的事实是,
i32
可自动复制。如果
中的类型不是
复制
,则您将无法按值获取内部值-您将只能克隆它或返回引用,例如,如下所示:

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

由于您只有对该选项的不可变引用,因此只能返回对其内容的不可变引用。Rust足够聪明,可以将文本
0
提升为一个静态值,以便在没有输入值的情况下能够返回它。

如果我想在框内获得对i32的引用(比如说我想修改它,让程序的另一部分看到更改的值),该怎么办,我将它写成
arg1.as|ref().map(|x |**x).unwrap_或(0)
@Moebius,我已经用一个引用的示例更新了我的答案,但是,我不完全理解修改值的含义。举个例子会很有帮助,但无论如何,它可能值得再问一个问题。@Vladimitmaveev没有特殊的用例,我只是出于好奇才问的。谢谢你的解决方案!如果我想在框内获得对i32的引用(比如说我想修改它,让程序的另一部分看到更改后的值)?FWIW,我会将其写成
arg1.as|ref().map(| x |**x)。unwrap_或(0)
@Moebius,但是我已经用引用更新了我的答案,我不太明白你说的修改值是什么意思。举个例子会很有帮助,但无论如何,它可能值得再问一个问题。@Vladimitmaveev没有特殊的用例,我只是出于好奇才问的。谢谢你的解决方案!