Result::unwrap_or în Rust

Result: operații care pot eșua Rust 1.0 (unwrap_or_default: 1.16)

Scoate valoarea din Ok sau, la eroare, folosește o valoare de rezervă: fixă, calculată din eroare sau implicită.

Sintaxă
fn unwrap_or(self, default: T) -> T
fn unwrap_or_else<F: FnOnce(E) -> T>(self, op: F) -> T
fn unwrap_or_default(self) -> T  // T: Default

Ce face Result::unwrap_or

Sunt variantele fără panică ale lui unwrap. unwrap_or(v) returnează v la eroare. unwrap_or_default() returnează valoarea implicită a tipului (0, text gol, vector gol).

unwrap_or_else(|e| ...) primește eroarea ca argument, deci poți s-o afișezi sau să alegi valoarea de rezervă după tipul ei. Funcția este apelată doar pentru Err.

Parametri

Parametru Descriere
default Valoarea folosită la eroare (la unwrap_or). Este calculată oricum.
op Funcția care primește eroarea și returnează valoarea de rezervă (la unwrap_or_else).

Ce returnează

Valoarea din Ok sau valoarea de rezervă, de tip T.

Exemple

Exemplul 1: Trei moduri de a avea o valoare de rezervă

fn main() {
    let texte = ["3", "trei"];
    for t in texte {
        let a = t.parse::<u32>().unwrap_or(1);
        let b = t.parse::<u32>().unwrap_or_default();
        let c = t.parse::<u32>().unwrap_or_else(|e| {
            println!("  {t:?} nu e număr ({e}), folosesc 10");
            10
        });
        println!("{t:?}: unwrap_or = {a}, unwrap_or_default = {b}, unwrap_or_else = {c}");
    }
}

Rezultat

"3": unwrap_or = 3, unwrap_or_default = 3, unwrap_or_else = 3
  "trei" nu e număr (invalid digit found in string), folosesc 10
"trei": unwrap_or = 1, unwrap_or_default = 0, unwrap_or_else = 10

Exemplul 2: Configurare cu valori implicite

Fișierul de configurare nu există în director, așa că se folosește textul implicit. Mesajul erorii vine de la sistemul de operare.

use std::fs;

fn main() {
    let config = fs::read_to_string("config.txt").unwrap_or_else(|e| {
        println!("Nu pot citi config.txt: {e}");
        String::from("tema=luminoasa")
    });
    println!("Configurare: {config}");
}

Rezultat

Nu pot citi config.txt: No such file or directory (os error 2)
Configurare: tema=luminoasa

Greșeli frecvente

  • Ascunzi erori importante: unwrap_or_default() pe o citire de fișier transformă orice problemă (permisiuni, disc plin) într-un text gol, fără niciun mesaj.
  • La unwrap_or_else uiți argumentul: pentru Result funcția primește eroarea, deci se scrie |e| ... (sau |_| ...), nu || ....

Comenzi înrudite

  • Result::unwrap: Scoate valoarea din Ok; pentru Err oprește programul cu panică. unwrap_err face invers: scoate eroarea.
  • 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::ok: Transformă un Result în Option: ok() păstrează valoarea și pierde eroarea; err() păstrează eroarea.
  • fs::read_to_string: Citește tot conținutul unui fișier text într-un String, dintr-un singur apel.