【发布时间】:2017-09-09 21:54:39
【问题描述】:
考虑这样的代码:
trait OnUpdate {
fn on_update(&mut self, x: &i32);
}
struct Foo {
field: i32,
cbs: Vec<Box<OnUpdate>>,
}
impl Foo {
fn subscribe(&mut self, cb: Box<OnUpdate>) {
self.cbs.push(cb);
}
fn set_x(&mut self, v: i32) {
self.field = v;
//variant 1
//self.call_callbacks(|v| v.on_update(&self.field));
//variant 2
let f_ref = &self.field;
for item in &mut self.cbs {
item.on_update(f_ref);
}
}
fn call_callbacks<CB: FnMut(&mut Box<OnUpdate>)>(&mut self, mut cb: CB) {
for item in &mut self.cbs {
cb(item);
}
}
}
如果我注释变体 2 并取消注释变体 1,
它无法编译,因为我同时需要 &Foo 和 &mut Foo。
但我真的需要这个地方的功能,因为我需要同样的功能 在多个地方调用回调的代码。
那么我这里需要宏来调用回调吗,或者可能是另一种解决方案?
旁注:在实际代码中,我使用大结构而不是i32,
所以我不能复制它。我在OnUpdate 也有几种方法,
所以我需要FnMut 中的call_callbacks。
【问题讨论】:
标签: rust