Rust 规避可变寿命限制

Rust 规避可变寿命限制,rust,lifetime,glium,Rust,Lifetime,Glium,我使用以下代码在Glium发出的每次重画请求事件发生时运行render::exec函数: event_loop.run(move |event, _, control_flow| { match event { Event::RedrawRequested(_) => { let mut target = display.draw(); render::exec(&mut target, &mut ct

我使用以下代码在Glium发出的每次重画请求事件发生时运行render::exec函数:

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
字体确实是在调用event_loop.run之前创建的,因为它是一个rusttype::font结构,我需要它才能在Glium应用程序中呈现文本。我知道,由于这是一个移动闭包,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提供的类型,也找不到将任何数据存储到作为参数传递的控制流中的方法

字体确实是在调用event_loop.run之前创建的,因为它是一个rusttype::font结构,我需要它才能在Glium应用程序中呈现文本。我知道,由于这是一个移动闭包,font中的数据在结束时将被释放,因此借用检查器不允许在闭包之外创建字体,因为无法确保闭包不会被多次调用,实际上,它被多次调用

那是不对的。它不在乎字体是在闭包之前创建的,因为它是在闭包之后移动到闭包中的。同样,多次调用闭包也没关系,字体现在属于闭包

闭包是一个具有关联函数的结构,作为环境一部分的所有变量实际上都被设置为该结构的成员,在调用函数以填充自由变量时,可以从中提取这些变量。就这样。在闭包之外创建项目时没有具体问题,否则如何关闭它们?或者多次调用闭包

让字体=字体; 设t:u8=0..5.mapmove | | Font::thing&Font.sum;
错误的意思是,在闭包内,您借用了一些东西,并试图将借用的东西移到闭包外。

您是否尝试将字体保留在Rc中?@rodrigo在闭包导致错误之前创建Rc:无法移出font_ref,FnMut闭包中捕获的变量,因为就我所知,Rc并没有实现拷贝,itRc不是拷贝,而是克隆。你克隆它并将克隆的值移动到闭包中。那么我怎么不移动它呢?你为什么不移动它?搬家看起来不错。这是一个问题,因为你没有提供相关信息,所以很难提供任何帮助。尽管一个简单的解决方案是将字体放在Rc后面,但是您可以拥有多个所有者,包括闭包的外部和内部。