This Rust poradnik wyjaśnia mechanizm fold()
dobrze, a ten przykładowy kod:Jak podsumować wektor za pomocą złożenia?
let sum = (1..4).fold(0, |sum, x| sum + x);
działa zgodnie z oczekiwaniami.
Chciałbym uruchomić go na wektorze, więc na podstawie tego przykładu, pierwszy to pisałem:
let sum: u32 = vec![1,2,3,4,5,6].iter().fold(0, |sum, val| sum += val);
który throwed błąd:
error: binary assignment operation `+=` cannot be applied to types `_` and `&u32` [E0368]
let sum = ratings.values().fold(0, |sum, val| sum += val);
^~~~~~~~~~
Domyśliłem się, że to może być błąd związany odniesienia dla jakiegoś powodu, więc zmieniłem że do fold(0, |sum, &val| sum += val)
, co wynikało z
error: mismatched types:
expected `u32`,
found `()`
Hm, może coś jest nie tak z zamknięciem? Korzystając ponownie z {sum += x; sum }
, otrzymuję ponownie .
Po dalszych prób i błędów, dodając mut
do sum
pracował:
let sum = vec![1,2,3,4,5,6].iter().fold(0, |mut sum, &x| {sum += x; sum});
Może ktoś wyjaśnić, dlaczego fold()
dla wektorów różni się tak bardzo od samouczka? Czy istnieje lepszy sposób na radzenie sobie z tym?
Dla porównania używam Rust beta, 2015-04-02.
Ty wprowadziła dużą różnicę zastępując 'suma + x' przez' sum + = x' . – Levans
Nie mogę w to uwierzyć, jak mógłbym tego przegapić ... Dzięki! – mmatyas