以下代码无法编译:
struct Foo {
values: Vec<i32>,
}
impl Foo {
fn len(&self) -> usize {
todo!()
}
fn set(&mut self) {
self.values[self.len()] = 0;
}
}
error[E0502]: cannot borrow `*self` as immutable because it is also borrowed as mutable
--> src/lib.rs:12:21
|
12 | self.values[self.len()] = 0;
| ------------^^^^^^^^^^-
| | |
| | immutable borrow occurs here
| mutable borrow occurs here
| mutable borrow later used here
有许多方法可以修复这个错误,对我来说最令人困惑的是:
fn set(&mut self) {
self.set_len(self.len()); // <----- double borrow again?
}
fn set_len(&mut self, index: usize) {
self.values[index] = 0;
}
为什么第一种情况无法编译,而第二种情况可以编译?在我看来,在这两种情况下,self
在一个表达式中都被借了两次--一次是沉默的,一次是不变的.这是不是有我看不到的微妙原因,或者是借阅判断器的怪癖?