rust - How do I sum a vector using fold? -


this rust tutorial explains fold() mechanism well, , example code:

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

works expected.

i'd run on vector, based on example, first wrote this:

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

which throwed error:

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

i guessed might reference-related error reason, changed fold(0, |sum, &val| sum += val), resulted with

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

hm, maybe something's wrong closure? using {sum += x; sum }, got

binary assignment operation `+=` cannot applied types `_` , `&u32` 

again.

after further trials , errors, adding mut sum worked:

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

could explain reason why fold() vectors differs tutorial? or, there better way handle this?

for reference, i'm using rust beta, 2015-04-02.

you've figured out += problem, i'd provide more exposition.

in case, arguments provided fold closure _ , &u32. first type not-yet-specified integer. if change fold call fold(0u32, |sum, val| sum += val), you'll different message:

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}` 

the result value of binary assignment operation += (), unit type. explains error message when changed fold(0, |sum, &val| sum += val):

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

if change fold(0, |sum, &val| {sum += val ; sum}), understandable error immutable variables:

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 `sum` 

from here, could mark sum mutable, correct solution fold sum + val, discovered.


in newer versions of rust, can sum iterator directly, skipping fold:

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

Popular posts from this blog