Rust中flat_map出现borrow错误,求生成字符串索引与字符对的解法
解决Rust中flat_map的借用错误(E0597)
我来帮你搞定这个问题!你遇到的error[E0597]: flat_map dropped here while still borrowed是因为闭包里的局部变量被提前销毁,但返回的迭代器还在借用它。
问题根源
你在flat_map的闭包里创建了is这个Vec,然后调用is.iter()生成一个借用该Vec的迭代器。但当闭包执行结束时,is会被自动销毁(离开作用域),而flat_map需要返回的迭代器得能在闭包外部继续使用——这就导致了悬垂引用,Rust的借用检查器自然会报错阻止你这么做。
修复方案(简洁版)
其实根本不需要额外创建is这个Vec,我们可以用std::iter::repeat(i)来重复生成索引值,直接和字符迭代器zip即可。这种方式不需要分配额外内存,也完全避免了借用问题:
fn main() { let names = vec!["Jane", "Jill", "Jack", "Johne"]; let name3 = names.iter().enumerate().flat_map(|(i, name)| { // 重复生成索引i,和每个字符配对 std::iter::repeat(i).zip(name.chars()) }); for (idx, c) in name3 { println!("{} {}", idx, c); } }
运行这段代码就能得到你预期的输出:
0 J 0 a 0 n 0 e 1 J 1 i 1 l 1 l ...
另一种修复(如果你想保留Vec的思路)
如果一定要用Vec来存储索引,那可以把is.iter()换成is.into_iter()——后者会消费整个Vec,返回拥有元素所有权的迭代器,不再依赖原来的Vec变量:
fn main() { let names = vec!["Jane", "Jill", "Jack", "Johne"]; let name3 = names.iter().enumerate().flat_map(|(i, name)| { let mut is = Vec::new(); for _k in 0..name.len() { is.push(i); } // 使用into_iter()获取所有权迭代器 is.into_iter().zip(name.chars()) }); for (idx, c) in name3 { println!("{} {}", idx, c); } }
不过第一种方案显然更优雅高效,推荐使用它~
内容的提问来源于stack exchange,提问作者Mochan
相关产品推荐
相关产品推荐

