Rust嵌套迭代器闭包报E0373错误如何避免额外内存分配
Rust嵌套迭代器闭包捕获变量生命周期报错问题
问题复现
我之前查找过同类问题,但现有公开问题的场景和我的需求存在差异。我尝试编译如下代码(实际场景为更复杂的版本):
let vec: Vec<f64> = …; let length = …; let iterator = (0usize..length) .flat_map(|i| (0usize..length).map(|j| vec[(i + j) % vec.len()]));
编译时触发如下所有权错误:
error[E0373]: closure may outlive the current function, but it borrows `i`, which is owned by the current function --> tests\test.rs:19:45 | 19 | .flat_map(|i| (0usize..length).map(|j| vec[(i + j) % vec.len()])); | ^^^ - `i` is borrowed here | | | may outlive borrowed value `i` |
诉求说明
我不希望获取vec的所有权,因此所有闭包都没有使用move关键字。理论上i是实现了Copy trait的可复制类型,完全可以被复制到内部(0usize..length).map(|j| vec[(i + j) % vec.len()])闭包中,但受vec借用规则的影响,当前i仅被借用,我不确定Rust是否支持指定闭包对部分变量采用借用、对部分变量采用复制的捕获方式。
如果将内部闭包的返回值通过.collect::<Vec<_>>()收集为向量即可解决该错误,但该方案会产生多次完全不必要的内存分配,我希望规避这类额外开销。
扩展场景
上述示例代码由宏生成,通用场景下宏可能生成任意层级的嵌套闭包,也会涉及任意数量需要借用的向量,示例如下:
let vec: Vec<f64> = …; let vec2: Vec<Vec<Vec<f64>>> = …; let length = …; let iterator = (0usize..length) .flat_map(|i| (0usize..length) .flat_map(|j| (0usize..length) .map(|k| vec[(i + j + k) % vec.len()] + vec2[i][j][k]));
内容的提问来源于stack exchange,提问作者Contactomorph
相关产品推荐
相关产品推荐

