Lecții din modul (2/2)
Potrivirea modelului, Opțiunea și Rezultatul
Rust are un mecanism de control al fluxului extrem de puternic numit potrivire de model. Vă permite să comparați o valoare cu o serie de modele și să executați cod pe baza modelului care se potrivește.
Declarația match
Declarația match din Rust este similară cu switch în alte limbi, dar mult mai puternică și mai sigură. Compilatorul se asigură că potrivirea este exhaustivă, ceea ce înseamnă că toate cazurile posibile trebuie tratate:
enum Direction {
North,
South,
East,
West,
}
let dir = Direction::East;
match dir {
Direction::North => println!("Andiamo a Nord"),
Direction::South => println!("Andiamo a Sud"),
Direction::East => println!("Andiamo a Est"),
Direction::West => println!("Andiamo a Ovest"),
}Gestionarea absenței valorii: Option
Rugina nu are conceptul de valoare nulă (null sau nil). În schimb, biblioteca standard definește o enumerare numită Option<T> care poate conține:
Some(T): conține o valoare de tipT.None: indică absența valorii.
let x: Option<i32> = Some(5);
let y: Option<i32> = None;
match x {
Some(val) => println!("C'e un valore: {}", val),
None => println!("Nessun valore trovato"),
}Gestionarea erorilor recuperabile: Result
Pentru operațiunile care pot eșua (cum ar fi citirea unui fișier sau analizarea unui șir într-un număr), Rust utilizează enumerarea Result<T, E>, care are două variante:
Ok(T): operația a reușit și conține valoarea de succesT.Err(E): operațiunea a eșuat și conține eroareaE.
fn divide(numerator: f64, denominator: f64) -> Result<f64, String> {
if denominator == 0.0 {
Err(String::from("Divisione per zero!"))
} else {
Ok(numerator / denominator)
}
}Datorită compilatorului lui Rust, sunteți forțat să gestionați cazul Err înainte de a putea accesa valoarea din interiorul Ok, prevenind multe erori comune de rulare.
Modelul Wildcard _
Când lucrați cu tipuri de date care au un număr mare de variante (cum ar fi numere întregi), listarea tuturor cazurilor într-un match este imposibilă. Rust permite utilizarea caracterului wildcard _ pentru a prinde toate cazurile rămase nedefinite în mod explicit:
let some_u8 = 3u8;
match some_u8 {
1 => println!("One"),
2 => println!("Two"),
_ => println!("Something else"), // Handles all other values
}Încercați-l singur
Declarați o variabilă numită maybe_value de tip Option<i32> care conține Some(42). Folosiți o instrucțiune de potrivire pe maybe_value: dacă conține Some(v) print „valoarea este: v” (folosind println!), dacă conține None, tipăriți „nicio valoare”.
Afișează indiciu
Scrieți un bloc `match maybe_value { Some(v) => println!('valoarea este: {}', v), None => println!('nicio valoare') }`.
Soluție disponibilă după 3 încercări
Completați funcția check_age astfel încât să returneze Ok('Adult') dacă vârsta este mai mare sau egală cu 18 ani, iar Err('Minor') în caz contrar.
Afișează indiciu
Folosiți `dacă vârsta >= 18` pentru a decide dacă să reveniți`Ok('Adult')`sau`Err('Minor')`.
Soluție disponibilă după 3 încercări
Declarați o enumerare numită Status care conține variantele Active și Inactive. În principal, declarați o variabilă current_status cu valoarea Status::Active. În cele din urmă, utilizați o declarație de potrivire pe current_status pentru a afișa „activ” dacă starea este Active sau „inactiv” dacă starea este Inactiv.
Afișează indiciu
Definiți enumerarea înainte de main cu `enum Status { Active, Inactive }`. În principal, utilizați `let current_status = Status::Active;`și efectuați`potrivirea` pe variante.
Soluție disponibilă după 3 încercări