我正在使用以下代码,以便在每次发生render::exec
事件(由Glium发布)时运行RedrawRequested
函数:
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
之前创建的,因为它是我要在Glium应用程序中呈现文本的rusttype::Font
结构。我知道,由于这是一个move
闭包,因此font
的数据将在其结尾处释放,因此借位检查器不允许在该闭包之外创建font
。不能确保闭包不会被多次调用(实际上,is被多次调用)。
我试图通过删除move
关键字来规避此问题,但是随后我从闭包内部借用的每个变量中触发了以下错误:
closure may outlive the current function, but it borrows `ctx`, which is owned by the current function
may outlive borrowed value `ctx`
我知道,由于无法确保借阅检查器至少可以在关闭期间持续使用这些变量,因此不允许从前者内部引用后者。
因此,我需要一种方法来确保借阅检查器确保这些变量will的持续时间至少与结束时间一样长。通常,一种方法是将它们作为参数传递给闭包,但是实际上我无法更改传递的参数列表,因为我使用的是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
中的方法。
字体确实是在调用event_loop.run之前创建的,因为它是我需要的rusttype :: Font结构,以便在Glium应用程序中呈现文本。我知道由于这是一个移动闭包,因此来自字体的数据将在其末尾释放,因此借用检查器不允许在闭包外部创建字体,因为不能确保闭包不会被多次调用(实际上,它被调用了多次)。
这是不正确的。不必担心font
是在闭包之前创建的,因为它是在闭包之后被移动到闭包中的。同样,多次调用闭包也没关系,字体现在属于闭包。闭包是具有关联功能的结构,所有属于环境的变量实际上都设置为该结构的成员,在调用该函数以填充自由变量时可以从中拉取它们。就是这样在闭包之外创建项目(您将如何关闭它们)还是多次调用闭包都没有特定的问题。
let font = Font;
let t: u8 = (0..5).map(move |_| font.thing()).sum();