Rust:折叠一组元组

时间:2017-11-24 11:05:58

标签: rust fold

我正在开展一个宠物项目,我发现自己有一个HashSet元组。具体地

HashSet<(String,generic_array::GenericArray<u8,generic_array::typenum::U32>, u64)>

我想对u64元素求和,并且可以使用for循环进行求解

for element in hashset{
        sum = sum+element.2;
    }

但是,我遇到了套装的折叠功能,我写了

let y = hashset.fold(0, |sum x| sum+x)

哪个有效,但我不清楚| sum x |的语法。我可以推断我只是命名变量,但我不明白我将如何扩展它。折叠如何知道要操作元组的哪个元素?

1 个答案:

答案 0 :(得分:3)

你真的应该展示一个最小,完整和可验证的例子。

首先,我建议你阅读Rust书。它真的很好,会告诉你Rust的基础知识,特别是迭代器,这似乎是你的问题。

此外,the documentation of the fold function可能会对您有所帮助。

我从上面简化了您的示例,因为我不知道generic_array::GenericArray<u8, generic_array::typenum::U32>类型,所以我删除了它,假设您想要从元组中总结u64

use std::collections::HashSet;

#[allow(unused_variables)]
fn main() {
    let values: HashSet<(String, u64)> = HashSet::new();
    let sum = values.iter().fold(0, |acc, x| acc + x.1);
}

x.1语法访问元组的第二个元素(从零开始计数)。在您的情况下,这是x.2,因为您有三个要素。 fold方法采用初始值(我的示例中为0)和闭包。

你的例子中的闭包是无效的Rust代码(它缺少参数之间的逗号),因此它不会被编译。请继续阅读Iterator::fold函数的工作原理,然后了解其工作原理。