Iterator::any în Rust

any verifică dacă măcar un element îndeplinește condiția; all verifică dacă toate o îndeplinesc. Se opresc cât de repede pot.

Sintaxă
fn any<F>(&mut self, f: F) -> bool
fn all<F>(&mut self, f: F) -> bool
where F: FnMut(Self::Item) -> bool

Ce face Iterator::any

any(|x| cond) returnează true la primul element care îndeplinește condiția și nu mai verifică restul. all(|x| cond) returnează false la primul element care nu o îndeplinește. Pentru un iterator gol, any dă false, iar all dă true („toate cele zero elemente îndeplinesc condiția”).

Spre deosebire de filter, closure-ul primește elementul prin valoare (Self::Item), deci pe v.iter() primești &T, nu &&T. Ambele cer &mut self: iteratorul rămâne utilizabil după oprire, de la elementul următor.

Parametri

Parametru Descriere
f Condiția aplicată fiecărui element.

Ce returnează

bool.

Exemple

Exemplul 1: Corigențe și promovare

fn main() {
    let note = [8, 4, 9, 10];
    println!("are vreo notă sub 5? {}", note.iter().any(|&n| n < 5));
    println!("toate sunt de trecere? {}", note.iter().all(|&n| n >= 5));

    let goale: [u32; 0] = [];
    println!("gol: any = {}, all = {}", goale.iter().any(|&n| n > 0), goale.iter().all(|&n| n > 0));
}

Rezultat

are vreo notă sub 5? true
toate sunt de trecere? false
gol: any = false, all = true

Exemplul 2: Verificarea unei parole

fn main() {
    for parola in ["parola", "Parola123", "P@rola2026"] {
        let are_cifra = parola.chars().any(|c| c.is_ascii_digit());
        let are_mare = parola.chars().any(|c| c.is_uppercase());
        let are_simbol = parola.chars().any(|c| !c.is_alphanumeric());
        let doar_ascii = parola.chars().all(|c| c.is_ascii());
        let ok = parola.len() >= 8 && are_cifra && are_mare && are_simbol && doar_ascii;
        println!("{parola:12} -> {}", if ok { "puternică" } else { "slabă" });
    }
}

Rezultat

parola       -> slabă
Parola123    -> slabă
P@rola2026   -> puternică

Exemplul 3: any se oprește la primul găsit

fn main() {
    let numere = [3, 8, 12, 5, 20];
    let gasit = numere.iter().any(|&n| {
        println!("  verific {n}");
        n > 10
    });
    println!("există un număr peste 10: {gasit}");
}

Rezultat

  verific 3
  verific 8
  verific 12
există un număr peste 10: true

Greșeli frecvente

  • Scrii filter(..).count() > 0 sau filter(..).next().is_some(): any e mai scurt și se oprește la fel de repede.
  • Te aștepți ca all pe o listă goală să dea false. Dă true; verifică și is_empty() dacă lista goală trebuie tratată separat.

Comenzi înrudite

  • Iterator::find: Returnează primul element care îndeplinește condiția, în Some, sau None dacă niciunul nu o îndeplinește.
  • Iterator::position: Returnează poziția (indexul de la 0) primului element care îndeplinește condiția, sau None.
  • Vec::contains: Verifică dacă vectorul conține un element egal cu valoarea dată; parcurge elementele unul câte unul.
  • Iterator::filter: Păstrează doar elementele pentru care condiția dată returnează true; restul sunt sărite.
  • Vec::windows: windows dă ferestre suprapuse de câte n elemente consecutive; chunks împarte vectorul în bucăți separate de câte n.