在 Rust 中捕获循环计数器副本的函数

Function that captures a copy of the loop counter in Rust

本文关键字:计数器 副本 函数 循环 Rust      更新时间:2023-10-16

我有一些看起来像这样的C++代码(简化到无用的地步,但我希望你明白这个想法)。它在循环中填充函数向量,并使每个函数通过复制捕获循环计数器:

std::vector<std::function<int()>> v;
for(int i = 1; i < N; i++) {
   v.push_back([i]() {return i;});
}
for(auto f: v) {
   std::cout << f() << "n";
}

我正在寻找与此等效的 Rust。目前,我有以下想法:

let mut v: Vec<Box<Fn() -> i32>> = vec![];
for i in 1..6 {
   v.push((|i| {Box::new(move || i)})(i));
}
for f in v {
   println!("{}", f());
}

它工作正常,但我不确定这是否是首选方式。是否真的需要调用帮助程序函数来实现这一点,或者是否有更惯用的方法?

怎么样只是:

v.push(Box::new(move || i));

完整的演示:

fn main() {
    let mut v: Vec<Box<Fn() -> i32>> = vec![];
    for i in 1..6 {
        v.push(Box::new(move || i));
    }
    for f in v {
        println!("{}", f());
    }
}