MST
星途 面试题库

面试题:Rust自定义迭代器中处理复杂逻辑的Iterator trait实现

假设有一个Rust结构体`FileLineReader`,用于读取文件中的每一行。请为这个结构体实现`Iterator` trait,使得每次迭代返回文件中的下一行内容。在实现过程中,需要处理文件读取可能出现的错误,例如文件不存在或读取失败。你需要合理使用`Result`类型来处理这些错误,并确保迭代器在错误发生时能正确停止迭代。
14.5万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
use std::fs::File;
use std::io::{self, BufRead, BufReader};

struct FileLineReader {
    reader: BufReader<File>,
}

impl FileLineReader {
    fn new(path: &str) -> Result<Self, io::Error> {
        let file = File::open(path)?;
        let reader = BufReader::new(file);
        Ok(FileLineReader { reader })
    }
}

impl Iterator for FileLineReader {
    type Item = Result<String, io::Error>;

    fn next(&mut self) -> Option<Self::Item> {
        let mut line = String::new();
        match self.reader.read_line(&mut line) {
            Ok(0) => None,
            Ok(_) => Some(Ok(line)),
            Err(e) => Some(Err(e)),
        }
    }
}

使用示例:

fn main() {
    let file_path = "example.txt";
    let mut reader = FileLineReader::new(file_path).unwrap();
    while let Some(result) = reader.next() {
        match result {
            Ok(line) => println!("Line: {}", line.trim()),
            Err(e) => eprintln!("Error: {}", e),
        }
    }
}