gpt4 book ai didi

closures - "error: closure may outlive the current function"但它不会比它长寿

转载 作者:行者123 更新时间:2023-11-29 07:43:19 24 4
gpt4 key购买 nike

当我尝试编译以下代码时:

fn main() {

(...)

let mut should_end = false;

let mut input = Input::new(ctx);

input.add_handler(Box::new(|evt| {
match evt {
&Event::Quit{..} => {
should_end = true;
}
_ => {}
}
}));

while !should_end {
input.handle();
}
}

pub struct Input {
handlers: Vec<Box<FnMut(i32)>>,
}

impl Input {
pub fn new() -> Self {
Input {handlers: Vec::new()}
}
pub fn handle(&mut self) {
for a in vec![21,0,3,12,1] {
for handler in &mut self.handlers {
handler(a);
}
}
}
pub fn add_handler(&mut self, handler: Box<FnMut(i32)>) {
self.handlers.push(handler);
}
}

我收到这个错误:

error: closure may outlive the current function, but it borrows `should_end`, which is owned by the current function

我不能简单地将move 添加到闭包中,因为我需要稍后在主循环中使用should_end。我的意思是,我可以,但是由于 boolCopy,它只会影响闭包内的 should_end,因此程序会永远循环。

据我了解,由于 input 是在 main 函数中创建的,而闭包存储在 input 中,因此它不可能比当前函数长寿。有没有办法向 Rust 表达闭包不会比 main 长寿?或者有没有可能我看不到闭包会比 main 活得更久?在后一种情况下,是否有办法强制它仅在 main 期间存在?

我是否需要重构我处理输入的方式,或者有什么方法可以让这项工作成功。如果我需要重构,我在哪里可以看到 Rust 中的一个很好的例子?

这是 a playpen of a simplified version .有可能我在其中犯了一个错误,可能会使您的浏览器崩溃。我遇到过一次,所以要小心。

如果需要,my code is available 的其余部分.所有相关信息都应该在 main.rsinput.rs 中。

最佳答案

问题不在于您的闭包,而在于 add_handler 方法。完全展开它看起来像这样:

fn add_handler<'a>(&'a mut self, handler: Box<FnMut(i32) + 'static>)

如您所见,特征对象上绑定(bind)了一个隐式 'static。显然我们不希望这样,所以我们引入第二个生命周期'b:

fn add_handler<'a, 'b: 'a>(&'a mut self, handler: Box<FnMut(i32) + 'b>)

由于您正在将 handler 对象添加到 Input::handlers 字段,因此该字段不能超过 handler 对象的范围。因此我们还需要限制它的生命周期:

pub struct Input<'a> {
handlers: Vec<Box<FnMut(i32) + 'a>>,
}

这再次要求 impl 具有生命周期,我们可以在 add_handler 方法中使用它。

impl<'a> Input<'a> {
...
pub fn add_handler(&mut self, handler: Box<FnMut(i32) + 'a>) {
self.handlers.push(handler);
}
}

现在剩下的就是使用 Cell 来控制对 should_end 标志的访问。

关于closures - "error: closure may outlive the current function"但它不会比它长寿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35651279/

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