Rust 尝试使用传递给成员方法中闭包的成员变量时出现所有权问题
我试图将glutin/winit的事件循环执行封装在一个自定义类中,如下面示例部分所述: 现在,我遇到了在传递给方法的闭包中尝试访问Rust 尝试使用传递给成员方法中闭包的成员变量时出现所有权问题,rust,closures,ownership,Rust,Closures,Ownership,我试图将glutin/winit的事件循环执行封装在一个自定义类中,如下面示例部分所述: 现在,我遇到了在传递给方法的闭包中尝试访问self成员时处理其所有权的问题: pub结构游戏窗口{ context:ContextWrapper, 事件循环:事件循环, 德国劳埃德船级社:Rc, } impl游戏窗口{ 发布fn运行(&self){ self.event_loop.run(移动|事件|控制|流|{ *控制流=控制流::轮询; 比赛项目{ 事件::WindowEvent{ 事件:WindowE
self
成员时处理其所有权的问题:
pub结构游戏窗口{
context:ContextWrapper,
事件循环:事件循环,
德国劳埃德船级社:Rc,
}
impl游戏窗口{
发布fn运行(&self){
self.event_loop.run(移动|事件|控制|流|{
*控制流=控制流::轮询;
比赛项目{
事件::WindowEvent{
事件:WindowEvent::CloseRequested,
..
} => {
*控制流=控制流::退出;
}
事件::MainEventsCleared=>{
不安全{
self.gl.Clear(gl::COLOR\u BUFFER\u BIT);
}
self.context.swap_buffers().unwrap();
}
_ => (),
}
});
}
}
编译器抱怨出现以下错误:self
具有匿名生存期'
,但它需要满足'静态
生存期要求
应用该建议(尽管我还不熟悉静态生命周期)会导致访问self.event\u loop
时出错:无法移出共享引用后面的self.event\u循环
解决这个问题的正确方法是什么?我通过创建
选项类型的事件循环
和调用self.event\u loop.take().unwrap().run(…)
的运行
方法解决了这个问题。不幸的是,我真的不喜欢这个解决方案的语义,因为从理论上讲,事件循环在窗口的整个生命周期内都存在,我的解决方案保留一个None
,这让我觉得根本不对。我相信您是在试图绕过一个实际的不安全模式,这将导致各种错误,但也许这会让你走上正确的方向。我相信这里的逻辑问题是,当闭包实际执行时,不能保证self仍然存在。EventLoop::run
消耗self
。您必须拥有EventLoop
(以及包含它的GameWindow
)的所有权才能调用它。