首页 > 解决方案 > 为什么我们不需要在一些 rust 迭代器中从 Result 中提取值?

问题描述

在这里,我有一个简单的映射和迭代器求和:

fn main() {
    let s = "
aoeu
aoeu
aoeu
aoeu
";

    let ls = s.lines();
    let i: usize = ls.map(|l| l.len()).sum();
    dbg!(i);
}

这编译并运行良好。当我查看源代码时lines,该next方法返回Option<Result<String>>

但是上面的地图直接调用.len()每个项目。我知道该值是从内部提取的Option(一个None值意味着迭代器的结尾)。是.len()被调用的Result对象吗?为什么我们不需要调用map()* 之类的东西来从中提取值Result

谢谢!

*我以为Result::map与 有不同的含义Iterator::map,但也许我自己感到困惑...

标签: rust

解决方案


标准库中有两个lines

一个onstr,它返回std::str::Lines,它是 的一个迭代器&str。这是您正在使用的那个。拆分字符串不会失败,因此不需要使用Result.

还有一个 onstd::io::BufRead,它返回std::io::Lines。这个从 a 读取BufRead,可能会失败(例如,如果驱动器无法访问,读取网络驱动器上的文件可能会失败),因此它必须返回 a Result


推荐阅读