Result::iter în Rust

Un iterator cu valoarea din Ok (un element) sau gol pentru Err; la colectare, Result oprește la prima eroare.

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

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-un Result dacă 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.