Rust:折叠一组元组

Rust: Folding a set of tuples

我正在做一个宠物项目,我发现自己有一个 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| 的语法。我可以推断我只是在命名变量,但我不明白我将如何对此进行扩展。另外,fold 如何知道要对元组的哪个元素进行操作?

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

首先,我建议您阅读 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 函数的工作原理,您就会明白它是如何工作的。