Ce face Result::iter
iter() tratează un Result ca pe o colecție cu un element (Ok) sau fără elemente (Err). Pe un iterator de rezultate, flatten() păstrează doar valorile reușite.
Foarte util este și faptul că poți colecta un iterator de Result-uri într-un singur Result<Vec<T>, E>: obții Ok(vector) dacă toate au reușit sau prima eroare apărută.
Ce returnează
Un iterator peste &T, cu cel mult un element.
Exemple
Exemplul 1: iter și flatten
fn main() {
let bun: Result<i32, String> = Ok(5);
let rau: Result<i32, String> = Err(String::from("eroare"));
println!("Ok are {} element, Err are {}", bun.iter().count(), rau.iter().count());
let rezultate = ["3", "x", "4"].map(|t| t.parse::<i32>());
let suma: i32 = rezultate.iter().flatten().sum();
println!("suma valorilor reușite: {suma}");
}
Rezultat
Ok are 1 element, Err are 0
suma valorilor reușite: 7
Exemplul 2: Toate sau prima eroare
collect::<Result<Vec<_>, _>>() se oprește la primul text invalid.
use std::num::ParseIntError;
fn main() {
let bune = ["1", "2", "3"];
let cu_eroare = ["1", "doi", "3"];
let a: Result<Vec<i32>, ParseIntError> = bune.iter().map(|t| t.parse()).collect();
let b: Result<Vec<i32>, ParseIntError> = cu_eroare.iter().map(|t| t.parse()).collect();
println!("{a:?}");
println!("{b:?}");
}
Rezultat
Ok([1, 2, 3])
Err(ParseIntError { kind: InvalidDigit })
Greșeli frecvente
- Folosești
flatten()când erorile contează: ele dispar fără niciun mesaj. Colectează într-unResultdacă vrei să afli de eroare.
Comenzi înrudite
Option::iter: Un iterator cu zero elemente (None) sau un singur element (Some); util pentru a combina opțiuni cu iteratori.Result::ok: Transformă un Result în Option: ok() păstrează valoarea și pierde eroarea; err() păstrează eroarea.Result: Tipul pentru operații care pot eșua: Ok(valoare) la succes sau Err(eroare) cu motivul eșecului.