为什么以下代码中的调用self.f2()
会触发借用检查器?难道else块不是在不同的作用域吗?这真是个难题!
use std::str::Chars;
struct A;
impl A {
fn f2(&mut self) {}
fn f1(&mut self) -> Option<Chars> {
None
}
fn f3(&mut self) {
if let Some(x) = self.f1() {
} else {
self.f2()
}
}
}
fn main() {
let mut a = A;
}
error[E0499]: cannot borrow `*self` as mutable more than once at a time
--> src/main.rs:16:13
|
13 | if let Some(x) = self.f1() {
| ---- first mutable borrow occurs here
...
16 | self.f2()
| ^^^^ second mutable borrow occurs here
17 | }
| - first borrow ends here
借用自身的范围不是始于self.f1()
的调用,终于该调用。一旦从f1()
的调用返回后,f1()
不再使用self,因此借用检查器不应该对第二个借用存在任何问题。请注意以下代码也会失败...
// ...
if let Some(x) = self.f1() {
self.f2()
}
// ...
我认为这里第二次借用应该没问题,因为f1
和f3
在同一时间内未与f2
使用self
。
if let
表达式周围的大括号,此代码仍将正常工作。 - Sandeep Dattaself.f1
的借用与self.f3
的借用的生命周期并不相同,但它们都由相同的生命周期'a
表示。 - Sandeep Datta