rust - 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)
,但这仍然不起作用,编译器说“溢出评估要求”。
解决方案
递归时删除&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
。我假设您的真实代码使用导致递归终止的循环条件......)
推荐阅读
- python - Python - 从文件夹中导入日期范围内的所有文件
- python - 从字典中获取 URL
- docker - tcp ip 连接到 macvlan 网络中 docker 容器中的打开端口
- c# - 如何避免 C# 中成员的“#if DEBUG”指令?
- python - Pandas:修改时间戳的分钟数
- php - 我可以在主机上安装 NginX,在 docker 容器中安装多个版本的 PHP
- apache-spark - hiveserver2(在火花上)-“mapred.FileInputFormat:要处理的输入文件总数”-为什么是单线程的?
- javascript - 通过 JavaScript 执行批处理文件
- reactjs - 对箭头函数进行测试时,酶 onclick spy toHaveBeenCalled 测试不起作用
- asp.net - Asp.Net Core 设置默认 API 版本控制