Rust 中的闭包生命周期通过简单的模式

Posted

技术标签:

【中文标题】Rust 中的闭包生命周期通过简单的模式【英文标题】:Closure lifetime in Rust through simple pattern 【发布时间】: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

【问题讨论】:

【参考方案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 感谢您的风格修正

以上是关于Rust 中的闭包生命周期通过简单的模式的主要内容,如果未能解决你的问题,请参考以下文章

如何为闭包参数声明生命周期?

使用字符串时 Rust 中的生命周期

什么是非词汇生命周期?

Rust 的生命周期

如何在线程中使用静态生命周期?

在 Rust 中与生命周期的子类型关系作斗争