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_elseuiți argumentul: pentruResultfuncț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.