Rust 第二个可变借用错误,只有一个可变借用

Rust 第二个可变借用错误,只有一个可变借用,rust,Rust,这没有多大意义,因为不管if let,它都返回相同的内容,但这是我遇到的问题的一个简明示例: struct Data { value: Option<i32>, } impl Data { fn get(&mut self) -> Option<&mut i32> { if let Some(val) = &mut self.value { return Some(val);

这没有多大意义,因为不管if let,它都返回相同的内容,但这是我遇到的问题的一个简明示例:

struct Data {
    value: Option<i32>,
}

impl Data {
    fn get(&mut self) -> Option<&mut i32> {
        if let Some(val) = &mut self.value {
            return Some(val);
        }

        return self.value.as_mut();
    }
}

这产生了同样的错误。这里发生了什么?

a的生命周期包含整个函数体,因为返回值需要借用
self
。因此,第一个借用的作用域将扩展到if表达式之外的整个函数体中

非词汇生存期旨在通过将第一次借用的范围缩小到只包含if表达式来解决这一问题。通过将借用值移动到局部变量中,可以看到这一点:

fn get(&mut self)->选项{
let value=&mut self.value;
如果让一些(val)=值{
返回一些(val);
}
返回值;
}
但是,支持有条件地返回值是因为它花费了太多的编译时间。此功能仍在使用中,可以使用
-Zpolonius
标志启用:
RUSTFLAGS=“-Zpolonius”货物+夜间建造


使用它,原始代码可以很好地编译。

顺便说一句,在块末尾使用explicit
return
不是惯用的方法。
{
    if let Some(val) = &mut self.value {
        return Some(val);
    }
}

return self.value.as_mut();