【问题标题】:Closure lifetime in Rust through simple patternRust 中的闭包生命周期通过简单的模式
【发布时间】:2021-12-16 06:36:35
【问题描述】:

我正在尝试使用 2 个结构在 Rust 中重新创建一个简单的回调模式。只要另一个准备好,一个就会传递一些逻辑来执行。这里的问题是,只有当结构中的某个值为真时,逻辑才会运行。

我可以理解为什么在这种情况下对 Foo 的引用需要为 'static 存在,但我不确定如何重构以便编译。

似乎是一个非常常规的用例,但也许我错过了一些东西,因为我是 Rust 的新手。

struct Foo {
    value: bool,
}

struct Bar {
    closure: Box<dyn Fn() -> ()>,
}

impl Foo {
    fn new() -> Self {
        Foo {
            value: false,
        }
    }
    fn set_closure(&self, b: &mut Bar) {
        b.closure = self.get_closure();
    }
    fn get_closure(&self) -> Box<dyn Fn() -> ()> {
        return Box::new(|| {
            if self.value {
                println!("true");
            } else {
                println!("false");
            }
        });
    }
}
impl Bar {
    fn new() -> Self {
        Bar {
            closure: Box::new(|| {})
        }
    }
    
}
fn main() {
    let foo = Foo::new();
    let mut bar = Bar::new();
    foo.set_closure(&mut bar);
    let closure = bar.closure;
    closure();
}

游乐场链接 -> here

【问题讨论】:

    标签: struct rust closures lifetime


    【解决方案1】:

    你需要将move的值放入闭包中:

    fn get_closure(&self) -> Box<dyn Fn() -> ()> {
        let value = self.value;
        Box::new(move || {
            if value {
                println!("true");
            } else {
                println!("false");
            }
        })
    }
    

    请注意,在您的示例中,值为bool,即复制。如果没有,您可以捕获引用或克隆它。 (如果捕获参考,您可能需要在那里调整一些生命周期)。 Playground

    【讨论】:

    • @Stargateur 感谢您的风格修正
    猜你喜欢
    • 2018-07-28
    • 2020-12-10
    • 2013-07-03
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 1970-01-01
    • 2017-05-03
    • 1970-01-01
    相关资源
    最近更新 更多