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.