在遍历成员时传递“自我”参考

时间:2019-06-25 00:09:42

标签: rust borrow-checker

我知道在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()可以同时使用selfbar的引用,而编译器不会抱怨呢?

编辑

我想到的几种解决方法:

  1. 使用指针
    fn do_it(&mut self) {
        let ptr = self as *const Bar;
        for foo in &mut self.foos {
            foo.perform(ptr);
        }
    }
  1. 远离载体,然后放回去
    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中获取字段而无需参考。

0 个答案:

没有答案