以下代码无法编译:
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
在一个表达式中被借用了两次 - 一次是可变的,一次是不可变的。这是否有我看不到的微妙原因,或者是借用检查器的怪癖?
最佳答案
这是借阅检查器的一个怪癖。实现了一个特殊规则来解决“调用可变方法,其中参数是另一个方法的结果”问题。
对于“访问成员并在需要方法结果时对其执行某些操作”没有特殊规则。先借用成员,然后就不能再借用整个对象来调用方法了。
关于rust - 在一个表达式中两次借用 self 有时会导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73769846/