Iterator::reduce în Rust

Combină elementele două câte două, folosind primul element ca valoare inițială; returnează None pentru un iterator gol.

Sintaxă
fn reduce<F>(self, f: F) -> Option<Self::Item>
where F: FnMut(Self::Item, Self::Item) -> Self::Item

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 reduce să returneze direct valoarea: returnează Option. Tratează cazul gol cu unwrap_or sau match.
  • Vrei un rezultat de alt tip decât elementele (de exemplu un text dintr-o listă de numere): reduce nu poate; folosește fold.

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.