在这里,我有一个简单的映射并通过迭代器求和:
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::map
与Iterator::map
的含义不同,但是也许我让自己感到困惑...
答案 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
。