避开封闭借用的可变寿命限制

问题描述 投票:0回答:1

我正在使用以下代码,以便在每次发生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中的方法。

rust lifetime glium
1个回答
0
投票

字体确实是在调用event_loop.run之前创建的,因为它是我需要的rusttype :: Font结构,以便在Glium应用程序中呈现文本。我知道由于这是一个移动闭包,因此来自字体的数据将在其末尾释放,因此借用检查器不允许在闭包外部创建字体,因为不能确保闭包不会被多次调用(实际上,它被调用了多次)。

这是不正确的。不必担心font是在闭包之前创建的,因为它是在闭包之后被移动到闭包中的。同样,多次调用闭包也没关系,字体现在属于闭包。闭包是具有关联功能的结构,所有属于环境的变量实际上都设置为该结构的成员,在调用该函数以填充自由变量时可以从中拉取它们。就是这样在闭包之外创建项目(您将如何关闭它们)还是多次调用闭包都没有特定的问题。

let font = Font; let t: u8 = (0..5).map(move |_| font.thing()).sum();

© www.soinside.com 2019 - 2024. All rights reserved.