首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >绕开闭锁-借入可变寿命限制

绕开闭锁-借入可变寿命限制
EN

Stack Overflow用户
提问于 2020-05-25 10:00:13
回答 1查看 90关注 0票数 0

我使用以下代码来在每次发生render::exec事件(由RedrawRequested发布)时运行我的RedrawRequested函数:

代码语言:javascript
复制
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引用上得到了以下错误:

代码语言:javascript
复制
borrowed data cannot be stored outside of its closure

font确实是在调用event_loop.run之前创建的,因为它是我需要的rusttype::Font结构,以便在Glium应用程序中呈现文本。我了解到,由于这是一个move闭包,来自font的数据在结束时将是免费的,因此,than检查器不允许在闭包之外创建font,因为它不能确保闭包不会被调用超过一次(实际上,它被调用了不止一次)。

我试图通过移除move关键字来规避这个问题,但是在我从闭包内部借用的每个变量上都会触发以下错误:

代码语言:javascript
复制
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,它具有以下签名:

代码语言:javascript
复制
pub fn run<F>(self, event_handler: F) -> !
where F: 'static + FnMut(Event<'_, T>, &EventLoopWindowTarget<T>, &mut ControlFlow)

我查看了Glutin文档,无法找到将任何数据存储到EventLoop (这是取消引用EventLoopWindowTarget提供的类型)或作为param传递的ControlFlow中的任何数据的方法。

EN

回答 1

Stack Overflow用户

发布于 2020-05-25 10:45:43

字体确实是在调用event_loop.run之前创建的,因为它是我在Glium应用程序中呈现文本所需的rusttype::event_loop.run结构。我了解到,由于这是一个移动闭包,来自字体的数据在结束时将是自由的,所以借检查器不允许在闭包之外创建字体,因为它不能确保闭包不会被调用超过一次(实际上,它被称为不止一次)。

这不对。它并不关心font是在闭包之前创建的,因为它是在闭包之后移动到闭包中的。同样,多次调用闭包并不重要,字体现在属于闭包。

闭包是一个带有关联函数的结构,环境中的所有变量实际上都被设置为结构的成员,在调用该函数时可以从中提取它们以填充空闲变量。事情就是这样。在创建闭包之外的项(否则如何关闭它们?)或多次调用闭包时,它没有特定的问题。

代码语言:javascript
复制
let font = Font;
let t: u8 = (0..5).map(move |_| Font::thing(&font)).sum();

错误的意思是,在闭包内部,你在借用一些东西,而你试图将它移到闭包之外。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62000056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档