【问题标题】:Rust: Folding a set of tuplesRust:折叠一组元组
【发布时间】:2017-11-24 11:05:57
【问题描述】:

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

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

我想对 u64 元素求和,并且可以使用 for 循环来做到这一点而不会出现问题:

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

但是,我遇到了集合的 fold 函数,我写了:

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

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

【问题讨论】:

  • |sum x| 不是有效的 Rust 语法。我邀请你写一个适当的minimal reproducible example 你所拥有的。
  • 嗯...它编译并运行所以...是的。至于写一个合适的例子......我在问一个关于我不理解的每一段代码的问题。重写我不理解的东西可能不会产生更好的代码段。
  • 这不是它的工作原理。提问者的工作是提供一个最小但可重复的例子来说明你正在经历的事情。我告诉你,你在问题中的内容不应该编译,所以你现在在问题中的内容不足以让我们理解问题。无论您是否不理解它通常都无关紧要,处理minimal reproducible example 是询问过程的一部分。另外,请附上您的编译器版本和工具链。

标签: rust fold


【解决方案1】:

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

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

另外,the documentation of the fold function 可能对您有很大帮助。

我从上面简化了你的例子,因为我不知道 generic_array::GenericArray&lt;u8, generic_array::typenum::U32&gt; 类型,所以我删除了它,假设你想从元组中总结 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 函数的工作原理,您就会明白它是如何工作的。

【讨论】:

  • 知道了。我不确定 x 本身是元组的元素还是元组本身。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-10
  • 1970-01-01
  • 2015-10-18
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多