首页 > 解决方案 > 如何访问 BufReader 两次?

问题描述

尝试第二次访问变量语句会导致value used here after move,我想了解如何存储总数而不会导致此问题。

我试图复制迭代器,但我找不到让它工作的方法或正确的方法。

extern crate regex;

use std::fs::File;
use std::path::Path;
use std::io::{BufReader, BufRead};

fn main() {
    let sentences_path = Path::new("csv/testSentences.csv");
    let sentences = BufReader::new(File::open(&sentences_path).unwrap());

    let total = sentences.lines().count();

    for (index, sentence) in sentences.lines().enumerate() {
        let line = sentence.unwrap();
        println!("Processed {} of {}, {}", index, total, line);
    }

    println!("Total {}", total);
}

标签: loopsrustiterator

解决方案


如果之前移动了所有权,您将无法访问该值。但是,您可以在不更改内部行而仅更新计数的情况下使用inspect检查您的行。

在通过迭代 Lines找到了之后count,您可以再次迭代它并按照您的意愿执行逻辑。

您收到此编译器错误的主要原因是:count函数消耗了您使用的行,并且您无法再次访问您的变量,因为它已经被消耗了。

这是解决方案:

use std::fs::File;
use std::io::{BufRead, BufReader, Write};

fn main() {
    let path = "lines.txt";

    let mut output = File::create(path).unwrap();
    write!(output, "Rust\n\nFun").unwrap();

    let input = File::open(path).unwrap();
    let buffered = BufReader::new(input);

    let lines: Vec<_> = buffered.lines().collect();
    let total = lines.len();

    for (index, sentence) in lines.into_iter().enumerate() {
        let line = sentence.unwrap();
        println!("Processed {} of {}, {}", index, total, line);
    }

    println!("Total {}", total);
}

操场

通过这种方式,您不需要读取文件两次。您读取文件,将其放入内存然后只迭代两次。


推荐阅读