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.