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

利斯特龙

我需要一个迭代器来流式传输Read. 这个迭代器:

  • 如果读取输入失败则返回错误
  • 返回一个字符串迭代器,每个字符串代表一个字母词
  • 忽略空字符串或包含以下字符的第一个单词 [a-zA-Z]

我最终得到了以下实现(在这里测试):

fn get_first_words<'a>(r: &'a mut impl Read) -> impl Iterator<Item = Result<String>> + 'a {
    BufReader::new(r).lines().filter_map(|rline| {
        match rline.map(|line| {
            line.split_whitespace()
                .next()
                .filter(|word| word.chars().all(char::is_alphabetic))
                .map(&str::to_string)
        }) {
            Err(e) => Some(Err(e)),
            Ok(Some(w)) => Some(Ok(w)),
            Ok(None) => None,
        }
    })
}

这工作正常,但比我预期的要复杂。在这个实现中有嵌套的迭代器,为了Result在过滤包含的值时保持包装类型,有一些类型杂耍

这是否可以写得更简单,更少的嵌套逻辑和更少的类型杂耍?

斯文·马尔纳赫

你可以用 替换你的match表达式Result::transpose()我还建议拆分返回第一个单词的函数,以使代码更具可读性。最后,你不需要接受&'a mut impl Read——简单地接受impl Read也可以,因为有一个实现for转发实现总之,简化的代码可能如下所示:Read&mut impl 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())
}

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用每行的第一个单词作为变量

获取每行的第一个非空值

如何获取每行的第一个单词并将其通过管道传递到dmenu脚本中

如何从Java 8的迭代器中获取n个第一个值?

获取第一个定界符之前的第一个单词

获取与迭代器函数匹配的集合的第一个元素

从rust中的通道迭代器获取第一个接收到的值

如何从输入短语中获取单词,然后使用C按字母顺序获取第一个单词和最后一个单词?

获取异步迭代的第一个元素

从Smarty Variable中获取第一个单词

获取ACF字段的第一个单词

如何将每行的第一个单词读入文件中的一行

在每行中将第一个单词替换为第三个单词,但单词之间用“:”分隔

如何通过sed在每行的第一个单词中添加双引号?

如何使用linux命令在文件中显示每行的第一个单词?

在每行的第一个单词处添加双引号

将每行的第一个单词替换为其MD5

更改每行第一个单词的大小写

为什么`read -r`仍然只获得每行的第一个单词?

用行号替换文件中每行的第一个单词

我如何打印出每行的第一个单词?

如何按每行的第一个单词将 pandas 中的行汇总为该第一个单词的聚合?

试图从用户输入中获取句子的长度,但是在第一个单词和空格之后停止

正则表达式,在第一个单词之后获取所有字符,直到空格或输入

Shell:如何根据每行的第一个单词提取第一次出现?

如何在每行中获取 n 个最后/第一个 True 的 NumPy 数组

将第一个迭代输入的值更改为下一个迭代输入值

为什么`zip`从第一个迭代器中又吃了一个元素?

std :: vector在最后一个之后使用第一个迭代器擦除