如何使用 fold 对向量求和?
How do I sum a vector using fold?
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; sum }
,我得到
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。
所以事实证明我的代码有很大的不同,就像我写的那样
sum += x
而不是
sum + x
好吧,至少我希望这个问题能有所帮助,以防有人遇到类似情况。
从 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
折叠。
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; sum }
,我得到
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。
所以事实证明我的代码有很大的不同,就像我写的那样
sum += x
而不是
sum + x
好吧,至少我希望这个问题能有所帮助,以防有人遇到类似情况。
从 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
折叠。