结构突变Vec <Box <dyn特性>

时间:2020-05-27 23:07:43

标签: rust

像这样的游乐场是什么习语版本:

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=5aed3c33d7bb0fb285878915ebce73be

trait Thing {
    fn update(&mut self, parent: &ThingHolder) {
        // Make some mutation of `self` 
        // which depends on method(s) from `parent`
    }
}

// Quick sample `Thing` implementation 
struct Usize(usize);
impl Thing for Usize {
    fn update(&mut self, parent: &ThingHolder) {
        self.0 += 1;  // Note a realistic case would depend on `parent`
    }
}

struct ThingHolder {
    things: Vec<Box<dyn Thing>>,
}
impl ThingHolder {
    fn update_things(&mut self) {
        for t in self.things.iter_mut() {
            t.update(&self);
        }
    }
}
  • 结构ThingHolder的特征向量对象(Vec<Box<dyn Thing>>)具有Boxs向量
  • 它想在每个update上调用一个(变异)Thing方法,该方法取决于其父ThingHolder的(不可变)数据
  • Thing的不同实现将在update的内容上有所不同

按原样,这是一个借用检查器错误:

error[E0502]: cannot borrow `self` as immutable because it is also borrowed as mutable
  --> src/lib.rs:23:22
   |
22 |         for t in self.things.iter_mut() {
   |                  ----------------------
   |                  |
   |                  mutable borrow occurs here
   |                  mutable borrow later used here
23 |             t.update(&self);
   |                      ^^^^^ immutable borrow occurs here

error: aborting due to previous error

我可以看到的主要替代方法是不进行变异,而是让Thing::update返回一个新的Box<dyn Thing>>并使用循环替换self.things中的元素。这是针对一些具有科学意义的代码,因此尚不清楚我是否要为每次更新复制每个Thing的惩罚。

我是否缺少其他好的选择?

谢谢!

0 个答案:

没有答案