在被关闭部分移动后不能使用结构

Can't use struct after its partially moved by closure

我正在尝试围绕 event_loop 和图形上下文的创建编写包装器结构:

struct GraphicalContext {
    pub el: crow::glutin::event_loop::EventLoop<()>,
    pub ctx: crow::Context
}

impl GraphicalContext {
    pub fn new(wb: WindowBuilder) -> Result<GraphicalContext, Box<dyn Error>> {
        let el = EventLoop::new();
        let ctx = Context::new(wb, &el)?;
        Ok( GraphicalContext { el, ctx } )
    }
}

fn main() {
    let window_bld = crow::glutin::window::WindowBuilder::new();
    let mut gc = GraphicalContext::new(window_bld).unwrap();
    let mut screen_texture: Option<crow::Texture> = None;
    gc.el.run(move |event, _, control_flow| {
        match event {
            ...
            Event::RedrawRequested(..) => {
                Some(t) => {
                    let mut surface = gc.ctx.surface();
                    gc.ctx.draw(&mut surface, &t, (0, 0), &DrawConfig::default());
                    gc.ctx.present(surface).unwrap(); // swap back-buffer
                },
                None => ()
            }
        }
    }

}

问题是编译器抱怨在调用 gc.el.run()gc 已被部分移动。它告诉我这是因为 run() 取得了 self 的所有权,但在这种情况下,self 只是 gc.el,但我不能在闭包中使用 gc.ctx .起初我以为是因为闭包使用了 move,然而,删除它并没有解决问题,还给了我另一个错误。有什么办法可以解决这个问题吗?

你想要的是解构你的结构以获得它的部分,这样你就可以只将其中一个移动到闭包中:

let GraphicalContext { el, ctx } = gc;
el.run(move |event, _, control_flow| {
    // use ctx
});