カウントするときにイテレータが消費されるようです。同じイテレータを使用してカウントし、それを反復するにはどうすればよいですか?カウントと繰り返しに同じイテレータを使用するにはどうすればよいですか?
私はファイル内の行を数えてから印刷しようとしています。私はファイルの内容を読むことができる、私は行数を数えることができるが、私はもはや内部カーソルがイテレータの終わりにあるかのように行を繰り返し処理することができません。
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);
}
}
あなたの答えをありがとう。私はイテレータのクローン作成については考えましたが、この場合は新しいイテレータを作成するのと同じですが反復にはコスト(「for」または「count」のいずれか)があることを理解していますが、反復する場合にのみコストがあり、必要な場合にのみ反復します。しかし、再度反復が不可能な場合は、新しい反復子を作成します。 – AnthonyB