尝试使用成员方法中传递给闭包的成员变量时的所有权问题
Ownership issues when attempting to work with member variables passed to closure in member method
我正在尝试将 glutin/winit 的事件循环执行封装在此处示例部分中描述的自定义 class 中:https://docs.rs/glutin/0.26.0/glutin/window/struct.Window.html
现在我 运行 在尝试在传递给方法的闭包中访问成员时处理 self
成员的所有权问题:
pub struct GameWindow {
context: ContextWrapper<PossiblyCurrent, Window>,
event_loop: EventLoop<()>,
gl: Rc<gl::Gl>,
}
impl GameWindow {
pub fn run(&self) {
self.event_loop.run(move |event, _, control_flow| {
*control_flow = ControlFlow::Poll;
match event {
Event::WindowEvent {
event: WindowEvent::CloseRequested,
..
} => {
*control_flow = ControlFlow::Exit;
}
Event::MainEventsCleared => {
unsafe {
self.gl.Clear(gl::COLOR_BUFFER_BIT);
}
self.context.swap_buffers().unwrap();
}
_ => (),
}
});
}
}
编译器提示以下错误:self
具有匿名生命周期 '_
但它需要满足 'static
生命周期要求。
应用该建议(即使我还不熟悉静态生命周期)会产生有关访问 self.event_loop
的错误:无法移出共享引用后面的 self.event_loop。
解决这个问题的正确方法是什么?
我通过创建 event_loop
类型 Option<EventLoop<()>>
和调用 self.event_loop.take().unwrap().run(...)
方法的 run
解决了这个特殊问题。不幸的是,我真的不喜欢这个解决方案的语义,因为理论上事件循环存在于 window 的整个生命周期中,而我的解决方案在其位置留下 None
感觉根本不对。
我正在尝试将 glutin/winit 的事件循环执行封装在此处示例部分中描述的自定义 class 中:https://docs.rs/glutin/0.26.0/glutin/window/struct.Window.html
现在我 运行 在尝试在传递给方法的闭包中访问成员时处理 self
成员的所有权问题:
pub struct GameWindow {
context: ContextWrapper<PossiblyCurrent, Window>,
event_loop: EventLoop<()>,
gl: Rc<gl::Gl>,
}
impl GameWindow {
pub fn run(&self) {
self.event_loop.run(move |event, _, control_flow| {
*control_flow = ControlFlow::Poll;
match event {
Event::WindowEvent {
event: WindowEvent::CloseRequested,
..
} => {
*control_flow = ControlFlow::Exit;
}
Event::MainEventsCleared => {
unsafe {
self.gl.Clear(gl::COLOR_BUFFER_BIT);
}
self.context.swap_buffers().unwrap();
}
_ => (),
}
});
}
}
编译器提示以下错误:self
具有匿名生命周期 '_
但它需要满足 'static
生命周期要求。
应用该建议(即使我还不熟悉静态生命周期)会产生有关访问 self.event_loop
的错误:无法移出共享引用后面的 self.event_loop。
解决这个问题的正确方法是什么?
我通过创建 event_loop
类型 Option<EventLoop<()>>
和调用 self.event_loop.take().unwrap().run(...)
方法的 run
解决了这个特殊问题。不幸的是,我真的不喜欢这个解决方案的语义,因为理论上事件循环存在于 window 的整个生命周期中,而我的解决方案在其位置留下 None
感觉根本不对。