为什么迭代器上`.map(…)`的返回类型如此复杂?

问题描述 投票:0回答:1

我有这个代码:

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 iterator
1个回答
1
投票

Rust 中的迭代器是惰性的。当您调用

some_iterator.lines(...).map(...)
时,不会完成任何实际迭代。相反,建立了一条链或“俄罗斯娃娃”结构,其中每个迭代器都包装它之前的迭代器。

当您尝试实际使用迭代器的结果时,它们都会开始执行。例如,通过循环读取它。如果您想立即执行计算并稍后使用结果,请在迭代器链的末尾添加

.collect()
(您可能必须指定要返回的集合,
.collect::<Vec<_>>()
等)。

© www.soinside.com 2019 - 2024. All rights reserved.