首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将` `fold`‘值放入HashMap中

将` `fold`‘值放入HashMap中
EN

Stack Overflow用户
提问于 2022-01-21 23:00:03
回答 1查看 80关注 0票数 0

在阅读了本文深入浅出学习编程概念之后,我似乎无法理解fold()在这个上下文中究竟是如何工作的。主要是fold()如何从split()中获取word变量。

下面是一个例子:

代码语言:javascript
复制
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变量..。

不知道我是否有合适的心理模型.

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-21 23:29:02

但是fold怎么知道如何抓住这个价值呢?

fold()是迭代器上的一种方法。这意味着它可以访问self (这是实际的迭代器),因此它可以调用self.next()来获取下一个条目(在本例中是单词,因为self的类型是Split,所以它的next()可以得到下一个单词)。您可以想象fold()是用以下伪代码实现的:

代码语言:javascript
复制
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
}

好的,上面的不是伪码,而是实际执行

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70808532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档