Rust 检测迭代器的最后一项

Rust 检测迭代器的最后一项,rust,Rust,我的代码逐行分析日志文件。最后一行通常为空(“”)行,应完全忽略。但是如何检测循环中的最后一行? 迭代器不知道它有多长,将所有项收集到一个数组效率很低,可能会占用太多内存 let file=file::open(&files[索引]) .map_err(| e | format!(“无法打开日志文件:{},e))?; 让reader=BufReader::new(文件); 对于reader.lines()中的(索引,行)。枚举(){ 让line=line.unwrap(); 如果是最后一行()&

我的代码逐行分析日志文件。最后一行通常为空(“”)行,应完全忽略。但是如何检测循环中的最后一行?
迭代器不知道它有多长,将所有项收集到一个数组效率很低,可能会占用太多内存

let file=file::open(&files[索引])
.map_err(| e | format!(“无法打开日志文件:{},e))?;
让reader=BufReader::new(文件);
对于reader.lines()中的(索引,行)。枚举(){
让line=line.unwrap();
如果是最后一行()&&line==“”{
打破
}
//用绳子做点什么。。。
}
是最后一行()
不存在。如何检测最后一行?

您可以使用适配器

这需要切换到手动迭代(让循环并显式调用
next
),但它允许您
peek()
迭代器查看是否有下一项。如果没有,您知道这是最后一行(至少对于更易融合的迭代器)

let file=file::open(&files[索引])
.map_err(| e | format!(“无法打开日志文件:{},e))?;
让reader=BufReader::new(文件);
让mut iterator=reader.lines().enumerate().peek();
而让Some((index,line))=iterator.next(){
如果line==“”&&iterator.peek()为_none(){
打破
}
//用绳子做点什么。。。
}
您可以使用适配器

这需要切换到手动迭代(让循环并显式调用
next
),但它允许您
peek()
迭代器查看是否有下一项。如果没有,您知道这是最后一行(至少对于更易融合的迭代器)

let file=file::open(&files[索引])
.map_err(| e | format!(“无法打开日志文件:{},e))?;
让reader=BufReader::new(文件);
让mut iterator=reader.lines().enumerate().peek();
而让Some((index,line))=iterator.next(){
如果line==“”&&iterator.peek()为_none(){
打破
}
//用绳子做点什么。。。
}
您可以使用以下功能:

use itertools::{Itertools, Position};

let file = File::open(&files[index]).map_err(|e| format!("Could not open log file: {}", e))?;
let reader = BufReader::new(file);

for line in reader.lines().enumerate().with_position() {
    match line {
        Position::Last((idx, _)) => println!("line {} is the last line!", idx),
        Position::First((idx, text)) | Position::Middle((idx, text)) => (),
        Position::Only((idx, _)) => println!("there is only one line in your file"),
    }
}
您可以使用以下功能:

use itertools::{Itertools, Position};

let file = File::open(&files[index]).map_err(|e| format!("Could not open log file: {}", e))?;
let reader = BufReader::new(file);

for line in reader.lines().enumerate().with_position() {
    match line {
        Position::Last((idx, _)) => println!("line {} is the last line!", idx),
        Position::First((idx, text)) | Position::Middle((idx, text)) => (),
        Position::Only((idx, _)) => println!("there is only one line in your file"),
    }
}

peakable很有趣,但它在这里的工作方式有点不同:
而让一些((line_index,Ok(line))=iterator.next()
。而且它似乎删除了最后一个空行,即没有if条件的默认值。我用不同的文件结尾测试了它。空行会被删除,中间空行不会被删除,包含内容的结束行不会被删除。通过这个while循环,我甚至不需要peek()。它也适用于enumerate()。我的示例代码不完整。在我不得不拆线之前。现在不再需要它了,当最后一行为空时循环停止。peakable很有趣,但它在这里的工作方式有点不同:
,而让一些((line_index,Ok(line))=iterator.next()
。而且它似乎删除了最后一个空行,即没有if条件的默认值。我用不同的文件结尾测试了它。空行会被删除,中间空行不会被删除,包含内容的结束行不会被删除。通过这个while循环,我甚至不需要peek()。它也适用于enumerate()。我的示例代码不完整。在我不得不拆线之前。现在不再需要这个了,当最后一行为空时循环停止。这也是一个很好的解决方案,但我更喜欢std库解决方案。谢谢。这完全取决于你,但这个答案不仅仅是关于你;)这是为世界上所有想知道如何解决和你们一样的问题的人准备的,我想向他们展示另一种实现它的方法。这就是Stackoverflow的精神。也是很好的解决方案,但我更喜欢std库解决方案。谢谢。这完全取决于你,但这个答案不仅仅是关于你;)这是为世界上所有想知道如何解决和你们一样的问题的人准备的,我想向他们展示另一种实现它的方法。这就是Stackoverflow的精神。