我使用以下代码来在每次发生render::exec事件(由RedrawRequested发布)时运行我的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 closurefont确实是在调用event_loop.run之前创建的,因为它是我需要的rusttype::Font结构,以便在Glium应用程序中呈现文本。我了解到,由于这是一个move闭包,来自font的数据在结束时将是免费的,因此,than检查器不允许在闭包之外创建font,因为它不能确保闭包不会被调用超过一次(实际上,它被调用了不止一次)。
我试图通过移除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提供的类型)或作为param传递的ControlFlow中的任何数据的方法。
发布于 2020-05-25 10:45:43
字体确实是在调用event_loop.run之前创建的,因为它是我在Glium应用程序中呈现文本所需的rusttype::event_loop.run结构。我了解到,由于这是一个移动闭包,来自字体的数据在结束时将是自由的,所以借检查器不允许在闭包之外创建字体,因为它不能确保闭包不会被调用超过一次(实际上,它被称为不止一次)。
这不对。它并不关心font是在闭包之前创建的,因为它是在闭包之后移动到闭包中的。同样,多次调用闭包并不重要,字体现在属于闭包。
闭包是一个带有关联函数的结构,环境中的所有变量实际上都被设置为结构的成员,在调用该函数时可以从中提取它们以填充空闲变量。事情就是这样。在创建闭包之外的项(否则如何关闭它们?)或多次调用闭包时,它没有特定的问题。
let font = Font;
let t: u8 = (0..5).map(move |_| Font::thing(&font)).sum();错误的意思是,在闭包内部,你在借用一些东西,而你试图将它移到闭包之外。
https://stackoverflow.com/questions/62000056
复制相似问题