为什么我们不需要在某些rust迭代器中从Result提取值?

时间:2019-08-16 18:50:41

标签: rust

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

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

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

这可以编译并正常运行。当我查看source for lines时,next方法返回Option<Result<String>>

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

谢谢!

*我以为Result::mapIterator::map的含义不同,但是也许我让自己感到困惑...

1 个答案:

答案 0 :(得分:5)

There are two lines in the standard library.

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

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