Direct naar de hoofdinhoud
Module 2 · Les 2 van 24/14 in de cursus~15 min
Modulelessen (2/2)

Patroonmatching, optie en resultaat

Rust heeft een extreem krachtig controlestroommechanisme genaamd patroonmatching. Hiermee kunt u een waarde vergelijken met een reeks patronen en code uitvoeren op basis van welk patroon overeenkomt.

De match-verklaring

De instructie match in Rust is vergelijkbaar met een switch in andere talen, maar veel krachtiger en veiliger. De compiler zorgt ervoor dat de match volledig is, wat betekent dat alle mogelijke gevallen moeten worden afgehandeld:

Rust
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"),
}

Omgaan met afwezigheid van waarde: Option

Rust kent niet het concept van een nulwaarde (null of nil). In plaats daarvan definieert de standaardbibliotheek een enum met de naam Option<T>, die het volgende kan bevatten:

  • Some(T): bevat een waarde van het type T.
  • None: geeft de afwezigheid van waarde aan.
Rust
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"),
}

Herstelbare fouten verwerken: Result

Voor bewerkingen die kunnen mislukken (zoals het lezen van een bestand of het parseren van een tekenreeks in een getal), gebruikt Rust de Result<T, E> enum, die twee varianten kent:

  • Ok(T): de bewerking is geslaagd en bevat de succeswaarde T.
  • Err(E): de bewerking is mislukt en bevat de fout E.
Rust
fn divide(numerator: f64, denominator: f64) -> Result<f64, String> {
    if denominator == 0.0 {
        Err(String::from("Divisione per zero!"))
    } else {
        Ok(numerator / denominator)
    }
}

Dankzij de compiler van Rust bent u gedwongen de zaak Err af te handelen voordat u toegang krijgt tot de waarde in Ok, waardoor veel voorkomende runtime-bugs worden voorkomen.

Het jokertekenpatroon _

Bij het werken met gegevenstypen die een groot aantal varianten hebben (zoals gehele getallen), is het onmogelijk om alle gevallen in een match op te sommen. Rust staat het gebruik van het jokerteken _ toe om alle resterende gevallen op te vangen die niet expliciet zijn gedefinieerd:

Rust
let some_u8 = 3u8;
match some_u8 {
    1 => println!("One"),
    2 => println!("Two"),
    _ => println!("Something else"), // Handles all other values
}

Probeer het zelf

Oefening#rust.m2.l2.e1
Pogingen: 0Laden…

Declareer een variabele met de naam misschien_waarde van het type Option<i32> met daarin Some(42). Gebruik een matchstatement op misschien_waarde: als het Some(v) bevat, print 'value is: v' (met println!), als het Geen bevat, print dan 'no value'.

Editor laden…
Toon hint

Schrijf een `match misschien_waarde { Some(v) => println!('waarde is: {}', v), Geen => println!('geen waarde') }` blok.

Oplossing beschikbaar na 3 pogingen

Oefening#rust.m2.l2.e2
Pogingen: 0Laden…

Voltooi de functie check_age zodat deze Ok('Adult') retourneert als de leeftijd groter is dan of gelijk is aan 18, en anders Err('Minor').

Editor laden…
Toon hint

Gebruik `if age >= 18`om te beslissen of u`Ok('Adult')`of`Err('Minor')` wilt retourneren.

Oplossing beschikbaar na 3 pogingen

Oefening#rust.m2.l2.e3
Pogingen: 0Laden…

Declareer een enum met de naam Status met daarin de varianten Actief en Inactief. Declareer in het algemeen een variabele current_status met de waarde Status::Active. Gebruik ten slotte een overeenkomstverklaring op current_status om 'actief' af te drukken als de status Actief is, of 'inactief' als de status Inactief is.

Editor laden…
Toon hint

Definieer de enum vóór main met `enum Status { Actief, Inactief }`. Gebruik in het algemeen `let current_status = Status::Active;`en voer de`match` uit op de varianten.

Oplossing beschikbaar na 3 pogingen