Rust 获取每行输入的第一个字的迭代器的简单实现

Rust 获取每行输入的第一个字的迭代器的简单实现,rust,iterator,Rust,Iterator,我需要一个迭代器来流式处理Read实现中每行的第一个字母单词。此迭代器: 如果读取输入失败,则返回错误 返回字符串的迭代器,每个字符串表示一个字母单词 忽略空字符串或包含除[a-zA-Z] 我最终得到了以下实现(): fn首先获取单词impl迭代器+'a{ BufReader::new(r).lines().filter_映射(| rline |{ 匹配rline.map(| line |{ line.split_空格() .next() .filter(| word | word.char

我需要一个迭代器来流式处理
Read
实现中每行的第一个字母单词。此迭代器:

  • 如果读取输入失败,则返回错误
  • 返回字符串的迭代器,每个字符串表示一个字母单词
  • 忽略空字符串或包含除
    [a-zA-Z]
我最终得到了以下实现():

fn首先获取单词impl迭代器+'a{
BufReader::new(r).lines().filter_映射(| rline |{
匹配rline.map(| line |{
line.split_空格()
.next()
.filter(| word | word.chars().all(char::按字母顺序排列))
.map(&str::to_字符串)
}) {
Err(e)=>一些(Err(e)),
好的(一些(w))=>一些(好的(w)),
Ok(无)=>无,
}
})
}
这很好,但比我预想的要复杂。这个实现中有嵌套的迭代器,并且在过滤包含的值时,为了保持
Result
作为包装类型,存在一些类型转换


这是否可以写得更简单,嵌套逻辑更少,类型变化更少

您可以将
匹配表达式替换为。我还建议拆分返回第一个单词的函数,以使代码更具可读性。最后,您不需要接受
&mut impl Read
——只需接受
impl Read
也可以,因为对于
&mut impl Read
有一个实现
Read
。总之,简化的代码可以如下所示:

fn first_word(s: String) -> Option<String> {
    s.split_whitespace()
        .next()
        .filter(|word| word.chars().all(char::is_alphabetic))
        .map(From::from)
}

fn get_first_words(r: impl Read) -> impl Iterator<Item = Result<String>> {
    BufReader::new(r)
        .lines()
        .filter_map(|line| line.map(first_word).transpose())
}
fn第一个单词(s:String)->选项{
s、 拆分空格()
.next()
.filter(| word | word.chars().all(char::按字母顺序排列))
.map(From::From)
}
fn获取第一个单词(r:impl Read)->impl迭代器{
新的(r)
.行()
.filter_map(| line | line.map(第一个单词).transpose())
}

编辑:使用
impl-Read
而不是
&mut-impl-Read
将导致可变引用被移动到函数中,而不是隐式重新加载,因此可能这毕竟不是一个好主意,因为记住在必要时显式重新加载它们会让人困惑。

对于
“但是,我不确定语义。”
,如果您的迭代器跳过这一行或返回
“not”
?从阅读您的解释来看,我希望是后者,但您的代码会返回前者。是的,就是这样。有这么多迭代器返回
结果,这不可能是一种罕见的情况。谢谢。