首页 > 解决方案 > Rust——如何在迭代中调用和传递闭包?

问题描述

我有一个迭代:

fn foo<F>(mut callback: F)
    where F: FnMut(MyStruct)
{
    // produce an instance of MyStruct
    callback(my_struct);
    for ... { // some conditions
        foo(callback)
    }
}

关闭可能是:

let my_vec = vec![];
let mut callback = |my_struct: MyStruct| {my_vec.push(my_struct);};
foo(callback);

在我的for循环中,所有权callback被移动,所以上面的代码不起作用。我尝试将参数替换为mut callback: &mut F, 并使用foo(&mut callback),但这仍然不起作用,编译器说“溢出评估要求”。

标签: rustclosures

解决方案


递归时删除&mut

fn foo<F>(callback: &mut F)
    where F: FnMut(MyStruct)
{
    let my_struct = MyStruct;
    callback(my_struct);
    for _ in 0..3 { // some conditions
        foo(callback);      // <- HERE
    }
}

Playground(注意:由于 的无限递归,这会在运行时溢出堆栈foo。我假设您的真实代码使用导致递归终止的循环条件......)


推荐阅读