< 返回版块

sharkLoc 发表于 2023-09-24 21:59

Tags:迭代器

代码示例如下,疑问在下面的注释中写出来了,求教,感谢!

use std::{
    fs::File,
    io::{BufRead, Read, BufReader},
};

pub struct Rec {
    reader: BufReader<File>,
}

impl Rec {
    pub fn new(file: &str) -> std::io::Result<Self>{
        Ok(Self {reader: File::open(file).map(BufReader::new)? })
    }
}

impl Iterator for Rec {
    type Item = Vec<String>;

    fn next(&mut self) -> Option<Self::Item> {
        let mut buf = Vec::new();

        for line in self.reader.by_ref().lines().flatten() {
            buf.push(line);
            if buf.len() == 4 {
               return Some(buf);  // Some(buf)  为何这里必须要显式调用return才可以编译通过?  
            }
        }

        if !buf.is_empty() {
            Some(buf)
        } else {
            None
        }
    }
}

fn main() {
    let file = "demo.txt";
    let recs = Rec::new(file).unwrap();
    for multi in recs {
        println!("{:?}",multi);
    }
}

评论区

写评论
ribs 2023-10-16 14:50

省略 return 的方式仅在函数的最后一个表达式可用 即使 for 是最后一个表达式,如果不 return或 break 的话,不就跳不出循环? 还有就是 for永远返回(),loop 才可以用 break name 跳出循环并返回 name return 用在 for 不是跳出循环,而是直接跳出函数返回

作者 sharkLoc 2023-09-25 09:05

额,好吧

--
👇
ttyy: 因为是在循环内

ttyy 2023-09-25 08:28

因为是在循环内

1 共 3 条评论, 1 页