如何在循环中将 lines() 迭代器作为参数传递给函数

How to pass lines() iterator as an argument to a function, in a loop

这是开头:

    let fb = BufReader::new(&f);
    let lines = fb.lines();

        let bank_sequence = read_1_sequence(&mut count, lines);
        print_seq(&bank_sequence);

这里是 read_1_sequence 函数:

    fn read_1_sequence<B: BufRead>(count: &mut u8, lines: Lines<B>)
// ...

    for line in lines {
        let the_line = line.unwrap();
        if the_line.len() > 0 {
        let first = &the_line[0..1];
        if first == ">" {
// etc.

但是,如果对 read_1_sequence 的调用处于循环中,如下所示:

    loop {
        let bank_sequence = read_1_sequence(&mut count, lines);
        print_seq(&bank_sequence);
    }

我收到(显然)消息:

26 |     let lines = fb.lines();
   |         ----- move occurs because `lines` has type `std::io::Lines<BufReader<&File>>`, which does not implement the `Copy` trait
...
29 |         let bank_sequence = read_1_sequence(&mut count, lines);
   |                                                         ^^^^^ value moved here, in previous iteration of loop

有解决办法吗?感谢您的任何提示。

祝你(编程)愉快!

其他答案建议克隆 lines,但这行不通,因为 Lines 没有实现 Clone(如果实现了,它可能会从每个循环中文件的开头)。相反,您应该将函数更改为 &mut Lines<B>:

fn read_1_sequence<B: BufRead>(count: &mut u8, lines: &mut Lines<B>)

并这样称呼它:

loop {
    let bank_sequence = read_1_sequence(&mut count, &mut lines);
    print_seq(&bank_sequence);
}