Rust:折叠一组元组

Dar*_*ian -2 fold rust

我正在做一个宠物项目,我发现自己有一个元组的哈希集。具体来说

HashSet<(String,generic_array::GenericArray<u8,generic_array::typenum::U32>, u64)>
Run Code Online (Sandbox Code Playgroud)

我想对 u64 元素求和,并且可以使用 for 循环来完成此操作,不会出现问题:

for element in hashset{
        sum = sum+element.2;
    }
Run Code Online (Sandbox Code Playgroud)

但是,我遇到了集合的折叠函数,并且我写了:

let y = hashset.fold(0, |sum x| sum+x)
Run Code Online (Sandbox Code Playgroud)

哪个有效,但我不清楚|sum x|. 我可以推断我只是简单地命名变量,但我不明白如何对此进行扩展。另外,fold 如何知道要对元组的哪个元素进行操作?

mus*_*tze 6

您确实应该展示一个最小的、完整的且可验证的示例。

首先,我建议你阅读 Rust 书。它真的很好,将向您展示 Rust 的基础知识,尤其是迭代器,这似乎是您的问题。

此外,该函数的文档fold可能会对您有很大帮助。

我简化了上面的示例,因为我不知道类型,所以我删除了它,假设您想从元组中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);
}
Run Code Online (Sandbox Code Playgroud)

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

您的示例中的闭包不是有效的 Rust 代码(它缺少参数之间的逗号),因此无法编译。继续阅读该Iterator::fold函数是如何工作的,您就会明白它是如何工作的。