将捕获变量的生命周期与闭包链接起来

问题描述 投票:0回答:1

我想将闭包传递给改变捕获变量的方法。

我可以做到这一点,但是编译器建议我为捕获的变量提供静态生命周期,否则它们的生命周期可能不够长。我有预感这不是我想要的,但我有点卡住了。

这是一个例子:

fn main() {
    struct NeedleFinder {
        on_needle_found: Box<dyn FnMut(usize)>,
    }
    
    impl NeedleFinder {
        fn new(on_needle_found: Box<dyn FnMut(usize)>) -> Self {
            Self { on_needle_found }
        }

        fn find_needles(& mut self, haystack: &Vec<&str>) {
            for (i, element) in haystack.iter().enumerate() {
                if *element == "needle" {
                    (self.on_needle_found)(i);
                }
            }
        }
    }

    // This poses no problem 
    let mut needle_finder = NeedleFinder::new(Box::new(|index| {
        println!("Found needle at index {}", index);
    }));
    needle_finder.find_needles(&vec!["haystack", "needle", "haystack", "needle"]);
    
    
    /*
    // This on the other hand does not work
    
    let mut needle_positions: Vec<usize> = vec![];

    let mut needle_finder = NeedleFinder::new(Box::new(|index| {
        println!("Found needle at index {}", index);
        needle_positions.push(index);
    }));

    needle_finder.find_needles(&vec!["haystack", "needle", "haystack", "needle"]);
    */
}

游乐场链接

我想这对于精通 Rust 的人来说是一个微不足道的问题,但我在这里有点挣扎,我会接受任何建议!

rust closures
1个回答
0
投票

感谢 Chayim Friedman 提供的解决方案! 🙇u200d♂️

© www.soinside.com 2019 - 2024. All rights reserved.