通过简单模式在 Rust 中关闭生命周期

Closure lifetime in Rust through simple pattern

我正在尝试使用 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();
}

游乐场 link -> here

您需要move将值放入闭包中:

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

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