vector - 如何使用 fold 对向量求和?

标签 vector rust

This Rust 教程很好地解释了 fold() 机制,这个示例代码:

let sum = (1..4).fold(0, |sum, x| sum + x);

按预期工作。

我想在向量上运行它,所以基于那个例子,我首先写了这个:

let sum: u32 = vec![1,2,3,4,5,6].iter().fold(0, |sum, val| sum += val);

抛出错误:

error: binary assignment operation `+=` cannot be applied to types `_` and `&u32` [E0368]
let sum = ratings.values().fold(0, |sum, val| sum += val);
                                              ^~~~~~~~~~

出于某种原因,我猜测这可能是一个与引用相关的错误,所以我将其更改为 fold(0, |sum, &val| sum += val),这导致了

error: mismatched types:
expected `u32`,
   found `()`

嗯,也许关闭有问题?使用 {sum += x;求和,我得到了

binary assignment operation `+=` cannot be applied to types `_` and `&u32`

再次。

经过进一步的试验和错误,将 mut 添加到 sum 工作:

let sum = vec![1,2,3,4,5,6].iter().fold(0, |mut sum, &x| {sum += x; sum});

有人可以解释为什么向量的 fold() 与教程有很大不同吗?或者有更好的方法来处理这个问题吗?

作为引用,我使用的是 Rust beta,2015-04-02。

最佳答案

从 Rust 1.11 开始,您可以 sum直接迭代器,跳过fold:

let sum: u32 = vec![1, 2, 3, 4, 5, 6].iter().sum();

您已经发现 += 是问题所在,但我想提供更多说明。

在您的例子中,提供给fold 闭包的参数是_&u32。第一种类型是一个尚未指定的整数。如果将折叠调用更改为 fold(0u32, |sum, val| sum += val),您会收到略有不同的消息:

let sum: u32 = vec![1,2,3,4,5,6].iter().fold(0u32, |sum, val| sum += val);
error[E0308]: mismatched types
  |
2 |     let sum: u32 = vec![1,2,3,4,5,6].iter().fold(0u32, |sum, val| sum += val);
  |                                                                          ^^^ expected u32, found &{integer}
  |
  = note: expected type `u32`
  = note:    found type `&{integer}`

二元赋值运算+=的结果值为(),单位类型。这解释了当您更改为 fold(0, |sum, &val| sum += val) 时的错误消息:

let mut a = 1;
let what_am_i = a += 1;
println!("{:?}", what_am_i); // => ()

如果您更改为 fold(0, |sum, &val| {sum += val ; sum}),您将收到有关不可变变量的可理解错误:

let sum: u32 = vec![1,2,3,4,5,6].iter().fold(0, |sum, &val| {sum += val; sum});
error[E0384]: re-assignment of immutable variable `sum`
 --> src/main.rs:2:66
  |
2 |     let sum: u32 = vec![1,2,3,4,5,6].iter().fold(0, |sum, &val| {sum += val; sum});
  |                                                      ---         ^^^^^^^^^^ re-assignment of immutable variable
  |                                                      |
  |                                                      first assignment to `sum`

从这里开始,您可以sum 标记为可变的,但正确的解决方案是简单地使用 sum + val 折叠,正如您发现的那样.

关于vector - 如何使用 fold 对向量求和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29548819/

相关文章:

c++ - vector 与字符串比较

rust - 如何使用不同版本的 Rust 编译器构建依赖关系?

rust - 为什么存储到 AVX2 256 位向量和从中加载在调试和 Release模式下有不同的结果?

rust - 什么时候在结构中定义多个生命周期有用?

C++ 在类构造函数中填充 vector

c++ - 将 unique_ptr 作为对插入 vector 中

c++ - 一个特定的测试用例不会以某种方式通过测试

rust - 如何将 Cargo.toml 文件中特定版本的依赖项列入黑名单?

rust - 从 Rust 填充 C 字符串指针的正确方法是什么?

c++ - std::vector::push_back 抛出段错误