Result::unwrap în Rust

Result: operații care pot eșua Rust 1.0 (expect: 1.4)

Scoate valoarea din Ok; pentru Err oprește programul cu panică. unwrap_err face invers: scoate eroarea.

Sintaxă
fn unwrap(self) -> T        // E: Debug
fn expect(self, msg: &str) -> T
fn unwrap_err(self) -> E    // T: Debug

Ce face Result::unwrap

unwrap() returnează valoarea din Ok. Dacă rezultatul este Err(e), programul intră în panică și afișează eroarea cu {:?}. expect("mesaj") face la fel, dar pune mesajul tău înaintea erorii.

unwrap_err() este opusul: returnează eroarea din Err și intră în panică pentru Ok. Se folosește mai ales în teste, ca să verifici ce eroare a apărut.

Ca și la Option, folosește-le doar când eșecul ar fi o greșeală de programare. Pentru erori care pot apărea în mod normal, tratează-le sau trimite-le mai departe cu ?.

Parametri

Parametru Descriere
msg La expect: textul afișat la panică, înaintea erorii.

Ce returnează

unwrap/expect: valoarea T din Ok. unwrap_err: eroarea E din Err.

Exemple

Exemplul 1: unwrap, expect și unwrap_err pe valori sigure

Textele sunt scrise de noi, deci știm dinainte rezultatul. unwrap_err scoate eroarea pentru textul invalid.

fn main() {
    let an: u32 = "2026".parse().unwrap();
    let luna: u32 = "10".parse().expect("luna este un număr scris corect în cod");
    println!("an = {an}, lună = {luna}");

    let eroare = "zece".parse::<u32>().unwrap_err();
    println!("eroare = {eroare}");
}

Rezultat

an = 2026, lună = 10
eroare = invalid digit found in string

Exemplul 2: Panica pentru Err

Mesajul de la expect este urmat de două puncte și de eroare, afișată cu {:?}.

fn main() {
    let text = "12,50";
    let pret: f64 = text.parse().expect("Prețul din fișier trebuie să fie un număr");
    println!("{pret}");
}

Rezultat (programul se oprește cu panică, codul de ieșire 101)


thread 'main' (51870) panicked at src/main.rs:3:34:
Prețul din fișier trebuie să fie un număr: ParseFloatError { kind: Invalid }
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

Greșeli frecvente

  • Scrii "12,50".parse::<f64>(): Rust folosește punctul zecimal, deci rezultatul este Err. Înlocuiește virgula cu replace(',', ".") înainte.
  • Folosești unwrap() peste tot și programul se oprește la prima eroare de intrare. Folosește match sau ? pentru erori așteptate.
  • Apelezi unwrap() pe un Result al cărui tip de eroare nu implementează Debug: nu compilează.

Comenzi înrudite

  • Result: Tipul pentru operații care pot eșua: Ok(valoare) la succes sau Err(eroare) cu motivul eșecului.
  • Result::unwrap_or: Scoate valoarea din Ok sau, la eroare, folosește o valoare de rezervă: fixă, calculată din eroare sau implicită.
  • Option::unwrap: Scoate valoarea din Some; pentru None programul se oprește cu panică. expect face la fel, cu mesajul tău.
  • panic::catch_unwind: Rulează o funcție și prinde panica ei, returnând Err în loc să oprească programul.