Option::unwrap în Rust

Scoate valoarea din Some; pentru None programul se oprește cu panică. expect face la fel, cu mesajul tău.

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

Ce face Option::unwrap

unwrap() returnează valoarea din Some(x). Dacă opțiunea este None, programul se oprește imediat cu o panică și mesajul called `Option::unwrap()` on a `None` value.

expect("mesaj") face exact același lucru, dar la panică afișează mesajul tău. Este preferat lui unwrap(), pentru că explică de ce te așteptai să existe o valoare și ușurează găsirea problemei.

Folosește-le doar când lipsa valorii ar fi o greșeală de programare (de exemplu, o constantă pe care tu ai scris-o corect) sau în exemple și teste. Pentru date venite de la utilizator, din fișiere sau din rețea, tratează cazul None cu match, unwrap_or sau ?.

Parametri

Parametru Descriere
msg Doar la expect: textul afișat dacă valoarea lipsește. Descrie ce te așteptai să fie adevărat.

Ce returnează

Valoarea de tip T din Some. Pentru None nu returnează: programul intră în panică.

Exemple

Exemplul 1: Când valoarea există

Vectorul nu este gol, deci max() dă sigur Some. expect documentează această presupunere.

fn main() {
    let note = [7, 10, 9];
    let maxima = note.iter().max().expect("vectorul de note nu este gol");
    println!("Nota maximă: {maxima}");

    let pret: Option<f64> = Some(49.5);
    println!("Preț: {} lei", pret.unwrap());
}

Rezultat

Nota maximă: 10
Preț: 49.5 lei

Exemplul 2: Panica pentru None

Al doilea apel găsește None, iar expect oprește programul. Ultima linie nu se mai execută. Numărul din paranteză după 'main' este identificatorul firului și diferă la fiecare rulare.

fn cauta_nota(nume: &str) -> Option<u8> {
    if nume == "Ana" {
        Some(10)
    } else {
        None
    }
}

fn main() {
    let nota = cauta_nota("Ana").expect("Elevul trebuie să existe în catalog");
    println!("Ana: {nota}");

    let alta = cauta_nota("Dan").expect("Elevul trebuie să existe în catalog");
    println!("Dan: {alta}");
}

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

Ana: 10

thread 'main' (48213) panicked at src/main.rs:13:34:
Elevul trebuie să existe în catalog
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

Greșeli frecvente

  • Folosești unwrap() pe date de la utilizator. Orice intrare neașteptată oprește programul. Tratează None explicit.
  • Scrii în expect ce s-a întâmplat ("nu am găsit") în loc de ce te așteptai ("elevul trebuie să existe"). Convenția Rust este a doua variantă.
  • Crezi că panica poate fi ignorată ca o excepție. O panică pe firul principal oprește programul cu codul de ieșire 101.

Comenzi înrudite

  • Option: Tipul care spune „poate există o valoare, poate nu”: Some(valoare) sau None, în locul lui null din alte limbaje.
  • Option::unwrap_or: Scoate valoarea din Some sau, pentru None, folosește o valoare de rezervă: fixă, calculată de o funcție sau implicită.
  • Result::unwrap: Scoate valoarea din Ok; pentru Err oprește programul cu panică. unwrap_err face invers: scoate eroarea.
  • panic::catch_unwind: Rulează o funcție și prinde panica ei, returnând Err în loc să oprească programul.