Ответ 1
Вы уже поняли, что проблема +=
, но я хотел бы предоставить еще несколько изложений.
В вашем случае аргументы, предоставляемые закрытию 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
, как вы обнаружили.
В новых версиях Rust вы можете просто sum
итератор напрямую, пропустив fold
:
let sum: u32 = vec![1,2,3,4,5,6].iter().sum();