我想将闭包传递给改变捕获变量的方法。
我可以做到这一点,但是编译器建议我为捕获的变量提供静态生命周期,否则它们的生命周期可能不够长。我有预感这不是我想要的,但我有点卡住了。
这是一个例子:
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 的人来说是一个微不足道的问题,但我在这里有点挣扎,我会接受任何建议!
感谢 Chayim Friedman 提供的解决方案! 🙇u200d♂️