我知道在Rust中,如果其中之一是可变的,就不可能有多个引用。因此,当我想在已借用成员的循环中将self
作为引用传递时,它将无法编译。
我有一个特征函数,它引用了bar
:
trait Foo {
fn perform(&mut self, bar: &Bar);
}
在Bar
中,我有一个Foo
s的向量:
struct Bar {
foos: Vec<Box<dyn Foo>>,
}
以下代码由于两次借用self
而无法编译
impl Bar {
fn do_it(&mut self) {
for foo in &mut self.foos {
foo.perform(self);
}
}
}
error[E0502]: cannot borrow `*self` as immutable because it is also borrowed as mutable
--> src/lib.rs:12:25
|
11 | for foo in &mut self.foos {
| --------------
| |
| mutable borrow occurs here
| mutable borrow later used here
12 | foo.perform(self);
| ^^^^ immutable borrow occurs here
是否有很好的方法可以使Foo::perform()
可以同时使用self
和bar
的引用,而编译器不会抱怨呢?
我想到的几种解决方法:
fn do_it(&mut self) {
let ptr = self as *const Bar;
for foo in &mut self.foos {
foo.perform(ptr);
}
}
fn do_it(&mut self) {
let len = self.foos.len();
for i in 0..len {
let foo = self.foos.swap_remove(i);
foo.perform(self);
self.foos.push(foo);
self.foos.swap(i, len-1);
}
}
但是,两种方法都不会生锈。我仍在寻找一种方法,使perform()
从Bar中获取字段而无需参考。