考虑以下代码:
struct Event {
id: i32,
}
struct EventsLoop;
impl EventsLoop {
pub fn new() -> EventsLoop {
EventsLoop {}
}
pub fn poll_events<F>(&mut self, _callback: F)
where
F: FnMut(Event),
{
// gets event and passes it to the callback
}
}
struct Store {
events_loop: EventsLoop,
running: bool,
}
fn main() {
let store = setup_store();
run_app(store);
}
fn setup_store() -> Store {
Store {
events_loop: EventsLoop::new(),
running: true,
}
}
fn run_app(mut store: Store) {
let mut e_loop = store.events_loop;
e_loop.poll_events(|event| {
// poll_events needs EventsLoop as a mutable reference
match event {
Event { id: -1 } => {
store.running = false;
}
_ => { /* store is used in other events */ }
}
})
}
这导致编译器抱怨:
error[E0382]: capture of partially moved value: `store`
--> src/main.rs:38:24
|
37 | let mut e_loop = store.events_loop;
| ---------- value moved here
38 | e_loop.poll_events(|event| {
| ^^^^^^^ value captured here after move
|
= note: move occurs because `store.events_loop` has type `EventsLoop`, which does not implement the `Copy` trait
我有一个需要借用或拥有store
所有权的闭包。同时,我需要store.events_loop
作为可变引用(由于其方法poll_events
)。我认为也许可以通过将EventsLoop
的所有权从store
传递到函数范围来解决多重可变借入问题。所以我的第一个问题是:
EventsLoop
移出store
来解决此问题吗?我想到的另一种解决方案是将store
传递给run_app
作为不可变的引用,并将字段running
包裹在Cell
中,但是随后我需要某种方法智能指针以获取EventsLoop
作为可变参考。所以这引出了我的第二个问题:
events_loop
作为不可变引用传递时,是否有一种方法可以从store
中提取store
作为可变引用?编辑:
我很抱歉在我的第一篇文章中没有MVCE。当前示例应重现该问题。
已建议此问题重复到Mutably borrow one struct field while borrowing another in a closure
这里的情况类似但不同。
链接中的问题是关于一个结构中的两个字段的,使用闭包中一个结构中的一个字段,该字段传递给另一个字段中的方法。
这个问题是关于在闭包中使用结构的,闭包被传递给该结构内部的字段的方法。
这里的要点是,我希望能够在闭包中访问存储,同时还可以从存储中获取事件循环。这个想法是在setup_store
初始化时创建的所有数据结构-包括事件循环-都进入单个结构。