gpt4 book ai didi

rust - 规避封闭借用的可变生命周期限制

转载 作者:行者123 更新时间:2023-12-03 11:45:29 28 4
gpt4 key购买 nike

我正在使用以下代码,以便在每次发生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之前创建的,因为这是我需要的 rusttype::Font结构,以便在Glium应用程序中呈现文本。我了解,由于这是 move闭包,因此 font中的数据将在其末尾释放,因此借用检查器不允许在闭包外部创建 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提供的类型),也没有存储到作为参数传递的 ControlFlow中的方法。

最佳答案

font is indeed created before the call to event_loop.run, since it is a rusttype::Font struct that I need in order to render text inside my Glium app. I understand that since this is a move closure, the data from font will be free'd at the end of it, so the borrow checker doesn't allow font to be created outside of the closure, because it isn't ensured that the closure won't be called more than once (and indeed, it is called more than once).



那是不对的。不需要在闭合之前创建 font,因为它是在之后移入闭合的。同样,多次调用该闭包也没关系,该字体现在属于该闭包。

闭包是具有关联功能的结构,环境中的所有变量实际上都设置为该结构的成员,在调用该函数以填充自由变量时可以从中拉取它们。就是这样在闭包外部创建项目(您将如何关闭它们)还是多次调用闭包都没有特定的问题。

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

错误的意思是,在封闭内部您正在借用某些东西,并且您正在尝试将借入移至封闭外部。

关于rust - 规避封闭借用的可变生命周期限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62000056/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com