loops - 如何访问 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);
}
解决方案
如果之前移动了所有权,您将无法访问该值。但是,您可以在不更改内部行而仅更新计数的情况下使用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);
}
通过这种方式,您不需要读取文件两次。您读取文件,将其放入内存然后只迭代两次。
推荐阅读
- python - 烧瓶在 appengine 和 dev_appserver 上处理 uriencoded 参数的方式不同
- selenium-webdriver - C# + NUnit + Selenium Grid - 在一个节点上并行启动多个浏览器
- c# - Math.Abs(ab) 安全吗?
- android - 如果我在我的应用更新 (android) 中关闭 setPersistenceEnabled,Firebase 会从缓存数据中读取吗
- python - 为轮廓图准备数据时遇到问题
- javascript - 防止在 iPad Safari 中的网页之间滑动
- php - Laravel - 使用碳从 Mysql 数据库中格式化日期
- sql - SQL 存储过程多维查询
- r - 保留 R 中矩阵的左上角列
- python - 分别从列中获取值并通过标签显示 - Python