我有这个代码:
let mut myFile = readFile();
let reader = BufReader::new(myFile);
let tasks = reader.lines()
.map(|line| line.expect("Couldn't read line"));
当我将鼠标悬停在“任务”上时,我会看到以下内容:
let tasks: Map<Lines<BufReader<File>>, fn(Result<String>) -> String>
看代码:
reader.lines()
给出文件中各行的迭代器。
map() 接受一个函数/闭包(它在每一行上执行一些操作并返回另一个值)。
所以我期望
map()
的返回值是另一个表示值列表的数据结构。
为什么它是
Map
?
Rust 中的迭代器是惰性的。当您调用
some_iterator.lines(...).map(...)
时,不会完成任何实际迭代。相反,建立了一条链或“俄罗斯娃娃”结构,其中每个迭代器都包装它之前的迭代器。
当您尝试实际使用迭代器的结果时,它们都会开始执行。例如,通过循环读取它。如果您想立即执行计算并稍后使用结果,请在迭代器链的末尾添加
.collect()
(您可能必须指定要返回的集合,.collect::<Vec<_>>()
等)。