Option::iter în Rust

Un iterator cu zero elemente (None) sau un singur element (Some); util pentru a combina opțiuni cu iteratori.

Sintaxă
fn iter(&self) -> Iter<'_, T>

Ce face Option::iter

iter() tratează opțiunea ca pe o colecție mică: Some(x) are un element (&x), None nu are niciunul. Așa poți adăuga o valoare opțională la un lanț de iteratori cu chain sau o poți parcurge cu for.

Option implementează și IntoIterator, deci for x in opt și vec.extend(opt) funcționează direct. Pe un iterator de opțiuni, flatten() păstrează doar valorile Some.

Ce returnează

Un iterator peste &T, cu cel mult un element.

Exemple

Exemplul 1: Adaugă o valoare opțională la o listă

Invitatul opțional se adaugă doar dacă există. Nu e nevoie de if.

fn main() {
    let invitati = ["Ana", "Mihai"];
    let plus_unu: Option<&str> = Some("Ioana");
    let fara: Option<&str> = None;

    let lista: Vec<&&str> = invitati.iter().chain(plus_unu.iter()).collect();
    println!("{lista:?}");

    let lista2: Vec<&&str> = invitati.iter().chain(fara.iter()).collect();
    println!("{lista2:?}");
}

Rezultat

["Ana", "Mihai", "Ioana"]
["Ana", "Mihai"]

Exemplul 2: Numără și adună doar valorile existente

flatten() trece prin fiecare opțiune ca printr-un iterator și sare peste None.

fn main() {
    let note = [Some(9), None, Some(7), Some(10), None];
    let existente: Vec<i32> = note.iter().flatten().copied().collect();
    println!("note existente: {existente:?}");
    println!("medie: {:.2}", existente.iter().sum::<i32>() as f64 / existente.len() as f64);

    for n in Some(5).iter() {
        println!("un singur element: {n}");
    }
    println!("None are {} elemente", None::<i32>.iter().count());
}

Rezultat

note existente: [9, 7, 10]
medie: 8.67
un singur element: 5
None are 0 elemente

Greșeli frecvente

  • Scrii if let Some(x) = opt { v.push(x) } când vrei doar să adaugi: v.extend(opt) este mai scurt.

Comenzi înrudite

  • Result::iter: Un iterator cu valoarea din Ok (un element) sau gol pentru Err; la colectare, Result oprește la prima eroare.
  • Option: Tipul care spune „poate există o valoare, poate nu”: Some(valoare) sau None, în locul lui null din alte limbaje.
  • Option::copied: Transformă Option<&T> în Option<T> copiind valoarea; util după get() sau first() pe numere.