rust 对不同的函数重用已经高级的迭代器

yzckvree  于 2023-01-17  发布在  其他
关注(0)|答案(1)|浏览(95)

当在一个文件中迭代的时候,我需要先做“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步时,“重用”它?

tkclm6bt

tkclm6bt1#

循环或使用迭代器适配器将消耗一个迭代器,但是如果I是一个迭代器,那么&mut I也是!
您可以使用该示例通过一个适配器部分地迭代迭代器,然后继续使用另一个适配器。第一次使用只使用可变引用,而不使用迭代器本身。例如,使用take

let mut it = reader.lines().map(|l| l.unwrap());
for lines in (&mut it).take(n) {
    do_task_a(&lines);
}
for lines in it {
    do_task_b(&lines);
}

但我觉得你原来的代码还是很好的。

相关问题