Rust 生锈-嵌套循环在内部循环中只运行一次

Rust 生锈-嵌套循环在内部循环中只运行一次,rust,Rust,我正在从文本文件中获取数据 let fil1_json = File::open("fil1.json")?; let mut fil1_json_reader = BufReader::new(fil1_json); let fil2_json = File::open("fil2.json")?; let mut fil2_json_reader = BufReader::new(fil2_json); for fil1_line in fil1_

我正在从文本文件中获取数据

let fil1_json = File::open("fil1.json")?;
let mut fil1_json_reader = BufReader::new(fil1_json);

let fil2_json = File::open("fil2.json")?;
let mut fil2_json_reader = BufReader::new(fil2_json);

for fil1_line in fil1_json_reader.by_ref().lines() {
    for fil2_line in fil2_json_reader.by_ref().lines() {
        println!("{:#?} ----- {:#?}", fil1_line, fil2_line);
    }
}
在第二个嵌套循环中,它只进入内部一次。在第一次迭代之后,
fil2\ujson\ureader
似乎变空了

它在哪里改变,而我在哪里都没有改变

它在哪里改变,而我在哪里都没有改变

读卡器使用数据。对于
文件
,这是很自然的期望,因为文件抽象几乎都有一个光标,每次阅读都会向前移动

如果要对同一数据进行多次迭代,那么最明显的选择是将其保存到内存中(通常在拆分为
行()
之前,但也可以保存这些行的向量,即使速度较慢)。但是,由于读卡器是由实际文件支持的,因此最好通过
seek
ing重新迭代文件,直到其开始:

fil2_json_reader.seek(SeekFrom::Start(0))

由于读取器由实际文件支持,因此最好重新迭代该文件→ 有争议:如果文件很小,最好将所有内容读入一个字符串并使用,这样可以避免为每行重新分配一个新的
string
。@Jmb没有必要为每行分配一个字符串。毫无理由地将整个文件分配和复制到内存中是浪费内存、缓存和性能的草率编码。是否为每一行分配一个
字符串
。如果文件较大,这比将整个文件存储在内存中要好,但如果文件较小,则避免重复分配会更好。@Jmb如果您关心性能或内存,没有人强迫您使用基于
行的接口,因为这是您的评论所抱怨的。存储整个文件在时间和空间上都是一种浪费,如果您过于关注性能或内存,您将无法承受这种浪费。如果你不在乎,那么你的评论一开始就是毫无意义的担忧:)