Result::ok în Rust

Transformă un Result în Option: ok() păstrează valoarea și pierde eroarea; err() păstrează eroarea.

Sintaxă
fn ok(self) -> Option<T>
fn err(self) -> Option<E>

Ce face Result::ok

ok() dă Some(v) pentru Ok(v) și None pentru Err: motivul erorii se pierde. Este util când nu te interesează de ce a eșuat o operație, doar dacă a reușit, de exemplu la filtrarea textelor care sunt numere valide.

err() face invers: Some(e) pentru Err(e) și None pentru Ok. Este util pentru a aduna doar erorile dintr-o listă de rezultate.

Ce returnează

Option<T> (la ok) sau Option<E> (la err).

Exemple

Exemplul 1: Păstrează doar numerele valide

filter_map păstrează elementele pentru care funcția dă Some; ok() face trecerea de la Result la Option.

fn main() {
    let intrari = ["10", "abc", "7", "", "9"];
    let note: Vec<u8> = intrari.iter().filter_map(|t| t.parse().ok()).collect();
    println!("note valide: {note:?}");
}

Rezultat

note valide: [10, 7, 9]

Exemplul 2: Adună erorile cu err()

fn main() {
    let intrari = ["10", "abc", "7", "-"];
    let erori: Vec<String> = intrari
        .iter()
        .filter_map(|t| t.parse::<u8>().err().map(|e| format!("{t:?}: {e}")))
        .collect();
    for e in &erori {
        println!("{e}");
    }
    println!("{:?}", "5".parse::<u8>().err());
}

Rezultat

"abc": invalid digit found in string
"-": invalid digit found in string
None

Greșeli frecvente

  • Folosești ok() când utilizatorul ar avea nevoie să afle de ce a eșuat operația: mesajul erorii se pierde.

Comenzi înrudite

  • Option::ok_or: Transformă un Option în Result: Some(x) devine Ok(x), iar None devine Err cu eroarea dată.
  • Result::unwrap_or: Scoate valoarea din Ok sau, la eroare, folosește o valoare de rezervă: fixă, calculată din eroare sau implicită.
  • Result::iter: Un iterator cu valoarea din Ok (un element) sau gol pentru Err; la colectare, Result oprește la prima eroare.
  • Result: Tipul pentru operații care pot eșua: Ok(valoare) la succes sau Err(eroare) cu motivul eșecului.