Ce face Iterator::reduce
reduce(|a, b| ...) seamănă cu fold, dar nu primește valoare inițială: pornește de la primul element și îl combină pe rând cu următoarele. Rezultatul are același tip ca elementele.
Pentru că un iterator gol nu are un prim element, rezultatul este un Option: None când nu există elemente. Este alegerea naturală pentru operații fără „element neutru” evident: cel mai lung cuvânt, maximul unor f64, unirea unor intervale. Este un consumator: parcurge iteratorul (sau doar cât are nevoie) și pornește lanțul de adaptoare leneșe din fața lui.
Parametri
| Parametru | Descriere |
|---|---|
f |
Closure care primește acumulatorul și elementul curent (același tip) și returnează noul acumulator. |
Ce returnează
Some(rezultat) sau None pentru un iterator gol.
Exemple
Exemplul 1: Maximul unor f64 și cel mai lung cuvânt
fn main() {
let temperaturi = [12.5, 18.25, -3.0, 7.5];
let maxim = temperaturi.iter().copied().reduce(f64::max);
println!("maxim: {:?}", maxim);
let cuvinte = ["mere", "portocale", "kiwi", "banane"];
let lung = cuvinte.iter().copied().reduce(|a, b| if b.len() > a.len() { b } else { a });
println!("cel mai lung: {:?}", lung);
}
Rezultat
maxim: Some(18.25)
cel mai lung: Some("portocale")
Exemplul 2: Iterator gol: None
fn main() {
let goale: Vec<i32> = Vec::new();
println!("{:?}", goale.iter().copied().reduce(|a, b| a + b));
println!("{:?}", [7].iter().copied().reduce(|a, b| a + b));
}
Rezultat
None
Some(7)
Greșeli frecvente
- Te aștepți ca
reducesă returneze direct valoarea: returneazăOption. Tratează cazul gol cuunwrap_orsaumatch. - Vrei un rezultat de alt tip decât elementele (de exemplu un text dintr-o listă de numere):
reducenu poate; foloseștefold.
Comenzi înrudite
Iterator::fold: Combină toate elementele într-o singură valoare, pornind de la o valoare inițială și aplicând o funcție pas cu pas.Iterator::min: Returnează cel mai mic (min) sau cel mai mare (max) element, ca Option: None pentru un iterator gol.Iterator::min_by_key: Găsește elementul minim sau maxim după un criteriu: o cheie calculată (by_key) sau o funcție de comparare (by).Iterator::sum: sum adună toate elementele, product le înmulțește; tipul rezultatului trebuie precizat.