在阅读了本文深入浅出学习编程概念之后,我似乎无法理解fold()在这个上下文中究竟是如何工作的。主要是fold()如何从split()中获取word变量。
下面是一个例子:
use std::collections::HashMap;
fn count_words(text: &str) -> HashMap<&str, usize> {
text.split(' ').fold(
HashMap::new(),
|mut map, word| { *map.entry(word).or_insert(0) += 1; map }
)
}锈病医生说:
fold()接受两个参数:一个初始值,一个带有两个参数的闭包:一个‘累加器’和一个元素。闭包返回累加器在下一次迭代中应该具有的值。
所以我得到mut map是累加器,split()返回一个迭代器,因此fold()对这些值进行迭代,但是fold如何知道如何获取这个值呢?它是隐式的通过,但我似乎不能把我的头围绕在这上面。如何映射到word变量..。
不知道我是否有合适的心理模型.
谢谢!
发布于 2022-01-21 23:29:02
但是
fold怎么知道如何抓住这个价值呢?
fold()是迭代器上的一种方法。这意味着它可以访问self (这是实际的迭代器),因此它可以调用self.next()来获取下一个条目(在本例中是单词,因为self的类型是Split,所以它的next()可以得到下一个单词)。您可以想象fold()是用以下伪代码实现的:
fn fold<B, F>(mut self, init: B, mut f: F) -> B
where
Self: Sized,
F: FnMut(B, Self::Item) -> B,
{
let mut accum = init;
while let Some(x) = self.next() {
accum = f(accum, x);
}
accum
}好的,上面的不是伪码,而是实际执行。
https://stackoverflow.com/questions/70808532
复制相似问题