在被关闭部分移动后不能使用结构
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
});
我正在尝试围绕 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
});