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

Rust 尝试使用传递给成员方法中闭包的成员变量时出现所有权问题,rust,closures,ownership,Rust,Closures,Ownership,我试图将glutin/winit的事件循环执行封装在一个自定义类中,如下面示例部分所述: 现在,我遇到了在传递给方法的闭包中尝试访问self成员时处理其所有权的问题: pub结构游戏窗口{ context:ContextWrapper, 事件循环:事件循环, 德国劳埃德船级社:Rc, } impl游戏窗口{ 发布fn运行(&self){ self.event_loop.run(移动|事件|控制|流|{ *控制流=控制流::轮询; 比赛项目{ 事件::WindowEvent{ 事件:WindowE

我试图将glutin/winit的事件循环执行封装在一个自定义类中,如下面示例部分所述:

现在,我遇到了在传递给方法的闭包中尝试访问
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
)的所有权才能调用它。