当在一个文件中迭代的时候,我需要先做“task_A”,然后做“task_B”。前几行是一些数据,我需要把它们放入某个数据结构(task_A)中,然后这些行描述了数据结构中的数据是如何被操作的(task_B)。现在我使用一个for循环,其中包含enumerate和if-else语句,这些语句根据文件号进行切换:
let file = File::open("./example.txt").unwrap();
let reader = BufReader::new(file);
for (i, lines) in reader.lines().map(|l| l.unwrap()).enumerate() {
if i < n {
do_task_a(&lines);
} else {
do_task_b(&lines);
}
}
还有用于迭代器的take_while()方法,但这只解决了一部分问题,理想情况下,我会将n步迭代器传递给一个函数,然后再传递给另一个函数,我希望有一个只需要迭代文件一次的解决方案。我想为Advent of Code 2022的第5天找到一个更优雅的解决方案。有没有办法做到这一点?当迭代器已经前进了n步时,“重用”它?
1条答案
按热度按时间tkclm6bt1#
循环或使用迭代器适配器将消耗一个迭代器,但是如果
I
是一个迭代器,那么&mut I
也是!您可以使用该示例通过一个适配器部分地迭代迭代器,然后继续使用另一个适配器。第一次使用只使用可变引用,而不使用迭代器本身。例如,使用
take
:但我觉得你原来的代码还是很好的。