这个问题已经在这里有一个答案:
- 在循环双可变借错误甚至NLL发生在 1个回答
我工作在一个大的文件,但是这是导致同样的问题一个小玩具的例子。 很抱歉,如果该示例本身是没有意义的。
#![feature(nll)]
struct S(i32);
impl S {
fn foo(&mut self) -> Option<&i32> {
if let Some(val) = self.bar() {
return Some(val);
}
let y = &mut self.0;
None
}
fn bar(&mut self) -> Option<&i32> {
None
}
}
fn main() {
S(0).foo();
}
这不通过借检查:
error[E0499]: cannot borrow `self.0` as mutable more than once at a time
--> test.rs:9:17
|
6 | if let Some(val) = self.bar() {
| ---- first mutable borrow occurs here
...
9 | let y = &mut self.0;
| ^^^^^^^^^^^ second mutable borrow occurs here
|
note: first borrowed value must be valid for the anonymous lifetime #1 defined on the method body at 5:5...
--> test.rs:5:5
|
5 | / fn foo(&mut self) -> Option<&i32> {
6 | | if let Some(val) = self.bar() {
7 | | return Some(val);
8 | | }
9 | | let y = &mut self.0;
10| | None
11| | }
| |_____^
如果不是这是有效的(即使没有#![feature(nll)]
),因为它是在返回if let
块? 值得一提的是,如果我改变了if let
块以下,它编译罚款
if self.bar().is_some() {
return self.bar();
}