计数时似乎消耗了迭代器.如何使用同一个迭代器进行计数,然后对其进行迭代?

我试图数一数文件中的行数,然后打印出来.我能够读取文件内容,能够计算行数,但是我不再能够像内部光标位于迭代器末尾那样迭代这些行.

use std::fs::File;
use std::io::prelude::*;

fn main() {
    let log_file_name = "/home/myuser/test.log";
    let mut log_file = File::open(log_file_name).unwrap();
    let mut log_content: String = String::from("");
    //Reads the log file.
    log_file.read_to_string(&mut log_content).unwrap();
    //Gets all the lines in a Lines struct.
    let mut lines = log_content.lines();
    //Uses by_ref() in order to not take ownership
    let count = lines.by_ref().count();
    println!("{} lines", count); //Prints the count
                                 //Doesn't enter in the loop
    for value in lines {
        println!("{}", value);
    }
}

Iterator没有reset方法,但内部游标似乎位于计数后迭代器的末尾.是否必须通过再次调用log_content.lines()来创建新的Lines,或者我可以重置内部光标?

目前,我找到的解决方法是创建一个新的迭代器:

use std::fs::File;
use std::io::prelude::*;

fn main() {
    let log_file_name = "/home/myuser/test.log";
    let mut log_file = File::open(log_file_name).unwrap();
    let mut log_content: String = String::from("");
    //Reads the log file.
    log_file.read_to_string(&mut log_content).unwrap();
    //Counts all and consume the iterator
    let count = log_content.lines().count();
    println!("{} lines", count);
    //Creates a pretty new iterator
    let lines = log_content.lines();
    for value in lines {
        println!("{}", value);
    }
}

推荐答案

调用count会消耗迭代器,因为它实际上会一直迭代,直到完成为止(即next()返回None).

使用by_ref可以防止使用迭代器,但迭代器仍然会被驱动完成(by_ref实际上只是将可变引用返回给迭代器,Iterator也会被实现为可变引用:impl<'a, I> Iterator for &'a mut I).

如果迭代器包含在完成后要重用的其他状态,这仍然很有用,但在本例中不是这样.

您可以简单地try Forking 迭代器(如果没有副作用,它们通常会实现Clone),尽管在这种情况下,重新创建迭代器也一样好(大多数时候创建迭代器的成本很低;真正的工作通常只有在您通过直接或间接调用next来驱动迭代器时才能完成).

所以不,(在这种情况下)你不能重置它,是的,你需要创建一个新的(或者在使用之前克隆它).

Rust相关问答推荐

在Rust中创建可变片段的可变片段的最有效方法是什么?

PyReadonlyArray2到Vec T<>

如何找到一个数字在二维数组中的位置(S)?

Rust TcpStream不能在读取后写入,但可以在不读取的情况下写入.为什么?

具有对同一类型的另一个实例的可变引用的

这个规则关于或模式到底是什么意思?如果表达片段的类型与p_i|q_i...&q;不一致,就会形成

限制未使用的泛型导致编译错误

制作一片连续整数的惯用Rust 方法?

Rust类似功能是C++命名空间吗?

闭包不会发送,即使它只捕获发送变量

用于判断整数块是否连续的SIMD算法.

我无法理解Rust范围的定义(Rust Programming Language,第二版克拉布尼克和尼科尔斯)

程序在频道RX上挂起

如何以与平台无关的方式将OsString转换为utf-8编码的字符串?

存储返回 impl Trait 作为特征对象的函数

在每个循环迭代中删除borrow

为什么可以在迭代器引用上调用 into_iter?

在 Rust 中枚举字符串的最佳方式? (字符()与 as_bytes())

在 Rust 中组合特征的不同方法是否等效?

Rust:为什么在 struct 中borrow 引用会borrow 整个 struct?