尝试使用成员方法中传递给闭包的成员变量时的所有权问题

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 感觉根本不对。