Rust中如何在循环中将Lines()迭代器作为参数传递给函数
问题解决方法
错误核心原因
std::io::Lines是有状态的迭代器类型,你当前的read_1_sequence函数采用值传递的方式接收lines参数,会直接拿走该迭代器的所有权。第一次循环调用函数后,lines变量的值已经被移动销毁,第二次循环尝试访问无效值,因此触发编译报错。
推荐解决方案:修改函数签名使用可变借用
这是改动最小、无额外性能开销的方案:
- 修改
read_1_sequence的参数类型,改为接收Lines的可变借用,不拿走所有权:
// 仅修改lines参数的类型为&mut Lines<B>,其余泛型约束、返回值保持不变 fn read_1_sequence<B: BufRead>(count: &mut u8, lines: &mut Lines<B>) -> 你原来的返回类型 { // 函数内部的遍历逻辑完全不需要改动,for循环迭代可变借用的迭代器不会消耗迭代器本身 for line in lines { let the_line = line.unwrap(); if the_line.len() > 0 { let first = &the_line[0..1]; if first == ">" { // 原有逻辑保持不变 } } } // 原有返回逻辑不变 }
- 调整调用侧代码适配新签名:
let fb = BufReader::new(&f); let mut lines = fb.lines(); // 这里要加mut关键字,因为需要修改迭代器的内部游标状态 loop { // 传入可变引用,迭代器所有权不会被转移 let bank_sequence = read_1_sequence(&mut count, &mut lines); print_seq(&bank_sequence); // 记得补充迭代结束的判断条件,比如读到文件末尾时跳出循环,避免死循环 }
其他可选方案
如果你因为外部依赖等原因无法修改read_1_sequence的函数签名,可以考虑每次循环都重新从文件创建BufReader和Lines迭代器,但该方案需要每次从头读取文件,仅适合小文件场景,大文件下性能损耗很高,不推荐使用。
内容的提问来源于stack exchange,提问作者Laurent Bloch
相关产品推荐
相关产品推荐

