我需要为标准输入创建两个迭代器。但是,我不知道如何实现这一点。
这是一个简单的例子:
use std::io::{self, BufRead, BufReader, Result};
fn main() {
let reader1 = BufReader::new(io::stdin()).lines();
let reader2 = BufReader::new(io::stdin()).lines();
for line in reader1 {
println!("reader1: {:?}", line);
}
for line in reader2 {
println!("reader2: {:?}", line);
}
}
输出:
$ printf '1\n2\n3\n4\n' | cargo run
reader1: Ok("1")
reader1: Ok("2")
reader1: Ok("3")
reader1: Ok("4")
迭代器reader2
永远不会被实现。
我想要完成的完整示例有点复杂......
use itertools::multipeek;
use std::io::{self, BufRead, BufReader, Result};
fn main() {
let reader = BufReader::new(io::stdin()).lines();
let mut mp = multipeek(BufReader::new(io::stdin()).lines());
for line in reader {
mp.next();
match line {
Ok(l) => {
println!("line: {}", l);
println!("peek: {:?}", mp.peek());
println!("peek: {:?}", mp.peek());
}
Err(e) => println!("error parsing line: {:?}", e),
}
}
}
输出:
$ printf '1\n2\n3\n4\n' | cargo run
line: 1
peek: None
peek: None
line: 2
peek: None
peek: None
line: 3
peek: None
peek: None
line: 4
peek: None
peek: None
据我所知,它与使用 stdin
有关,因为它在从文件读取时工作正常。
最佳答案
我对 Rust 不太熟悉,无法提供具体的解决方案,但你失败了,因为在第 6-8 行你处理了 stdin(成行),然后在第 10-12 行你尝试再次处理它。但已经没有什么可以进行第二次处理了;你已经处理过了。
请记住,reader1
和 reader2
是读取器,而不是缓冲区。它们不会复制输入流。
如果您希望查看先前输入的任何部分,则必须将其读入某种存储对象中。然后您可以创建一个 BufReader
或以其他方式准备对该数据的访问。
从您似乎正在做的事情来看,一种简单的方法就是创建一个 BufReader
对象来使用输入填充字符串数组。然后根据需要多次迭代该数组。
关于loops - 如何迭代 stdin 两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57486991/