我使用以下代码在render::exec
每次发生RedrawRequested
事件时运行我的函数(由 Glium 发布):
event_loop.run(move |event, _, control_flow| {
match event {
Event::RedrawRequested(_) => {
let mut target = display.draw();
render::exec(&mut target, &mut ctx, &font, &mut cache);
target.finish().unwrap();
}
// ...
_ => ()
}
});
问题是,我在&font
参考中收到以下错误:
borrowed data cannot be stored outside of its closure
font
确实是在调用之前创建的event_loop.run
,因为它是rusttype::Font
我需要的一个结构,以便在我的 Glium 应用程序中呈现文本。我知道,由于这是一个move
闭包,因此数据font
将在其末尾被释放,因此借用检查器不允许font
在闭包之外创建,因为不能确保闭包不会' t 被多次调用(实际上,它被多次调用)。
我试图通过删除move
关键字来规避这一点,但是我从闭包内部借用的每个变量都会触发以下错误:
closure may outlive the current function, but it borrows `ctx`, which is owned by the current function
may outlive borrowed value `ctx`
我知道,由于借用检查器无法确保这些变量至少与闭包一样长,因此它不允许从前者内部引用后者。
因此,我需要一种方法来确保借用检查器这些变量的持续时间至少与闭包一样长。通常这样做的一种方法是将它们作为参数传递给闭包,但实际上我无法更改传递的参数列表,因为我使用event_loop.run
的是具有以下签名的 :
pub fn run<F>(self, event_handler: F) -> !
where F: 'static + FnMut(Event<'_, T>, &EventLoopWindowTarget<T>, &mut ControlFlow)
我浏览了 Glutin 文档,但找不到将任何数据存储到EventLoop
(这是取消引用EventLoopWindowTarget
提供的类型)的方法,也找不到ControlFlow
作为参数传递的 。