像这样的游乐场是什么习语版本:
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的惩罚。
我是否缺少其他好的选择?
谢谢!