这个 Rust教程fold()很好地解释了这个机制,这个代码如下:
let sum = (1..4).fold(0, |sum, x| sum + x);
Run Code Online (Sandbox Code Playgroud)
按预期工作.
我想在一个向量上运行它,所以基于这个例子,我首先写了这个:
let sum: u32 = vec![1,2,3,4,5,6].iter().fold(0, |sum, val| sum += val);
Run Code Online (Sandbox Code Playgroud)
哪个引起了错误:
error: binary assignment operation `+=` cannot be applied to types `_` and `&u32` [E0368]
let sum = ratings.values().fold(0, |sum, val| sum += val);
^~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)
我猜这可能是由于某种原因引起的与引用相关的错误,因此我将其更改为fold(0, |sum, &val| sum += val),结果是
error: mismatched types:
expected `u32`,
found `()`
Run Code Online (Sandbox Code Playgroud)
嗯,关闭可能有些问题?使用{sum += x; sum },我得到了
binary assignment operation `+=` cannot be applied to types `_` and `&u32`
Run Code Online (Sandbox Code Playgroud)
再次.
经过进一步的试验和错误,添加mut到sum工作:
let sum = vec![1,2,3,4,5,6].iter().fold(0, |mut sum, &x| {sum += x; sum});
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么fold()矢量与教程有很大不同?或者有更好的方法来处理这个问题吗?
作为参考,我正在使用Rust beta,2015-04-02.
She*_*ter 34
你已经知道这sum是问题,但我想提供一些更多的阐述.
在您的情况下,提供给fold闭包的参数是+=和fold.第一种类型是尚未指定的整数.如果您将折叠通话更改为_,则会收到略有不同的消息:
let sum: u32 = vec![1, 2, 3, 4, 5, 6].iter().sum();
Run Code Online (Sandbox Code Playgroud)
let sum: u32 = vec![1,2,3,4,5,6].iter().fold(0u32, |sum, val| sum += val);
Run Code Online (Sandbox Code Playgroud)
二进制赋值操作的结果值&u32是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}`
Run Code Online (Sandbox Code Playgroud)
如果更改为(),则可以获得有关不可变变量的可理解错误:
let mut a = 1;
let what_am_i = a += 1;
println!("{:?}", what_am_i); // => ()
Run Code Online (Sandbox Code Playgroud)
let sum: u32 = vec![1,2,3,4,5,6].iter().fold(0, |sum, &val| {sum += val; sum});
Run Code Online (Sandbox Code Playgroud)
从这里开始,您可以标记fold(0, |sum, &val| sum += val)为可变,但正确的解决方案是简单地折叠fold(0, |sum, &val| {sum += val ; sum}),如您所发现的那样.
在较新版本的Rust中,您也可以直接sum使用迭代器,跳过sum + val:
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`
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
22797 次 |
| 最近记录: |