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

Eigenschappen en eigenschapsgrenzen

Eigenschappen definiëren het gedrag dat een bepaald type vertoont en kan delen met andere typen. We kunnen eigenschappen gebruiken om een ​​reeks methoden te definiëren die een bepaalde gemeenschappelijke functionaliteit of interface vertegenwoordigen, vergelijkbaar met interfaces in andere programmeertalen.

Met Trait-grenzen kunnen we specificeren dat een generiek type een specifieke eigenschap moet implementeren, zodat de vereiste methoden tijdens het compileren beschikbaar zijn.


Een eigenschap definiëren en implementeren

Om een ​​eigenschap te definiëren, gebruiken we het trefwoord trait, gevolgd door de handtekeningen van de methoden die implementatietypen moeten definiëren:

Rust
pub trait Summary {
    fn summarize(&self) -> String;
}

Om een ​​eigenschap op een betontype te implementeren, gebruiken we de syntaxis impl TraitName for TypeName:

Rust
pub struct NewsArticle {
    pub headline: String,
    pub content: String,
}

impl Summary for NewsArticle {
    fn summarize(&self) -> String {
        format!("{}", self.headline)
    }
}

Eigenschapsgrenzen

Bij het schrijven van generieke functies kunnen we de typeparameters beperken om ervoor te zorgen dat ze een specifieke eigenschap implementeren. De standaardsyntaxis is <T: Trait>:

Rust
pub fn notify<T: Summary>(item: &T) {
    println!("Notification: {}", item.summarize());
}

Als alternatief kunnen we voor complexere handtekeningen de where clausule gebruiken:

Rust
pub fn notify_advanced<T>(item: &T)
where
    T: Summary
{
    println!("Notification: {}", item.summarize());
}

Probeer het zelf

Oefening 1: De samenvattende eigenschap

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

Definieer een eigenschap met de naam Summary die de handtekening van de methode fn summum(&self) -> String; bevat. Definieer vervolgens een struct News Article met een kopveld van het type String en implementeer daarvoor de eigenschap Samenvatting, zodat de samenvattingsmethode de waarde van het kopveld retourneert.

Editor laden…
Toon hint

Definieer de eigenschap 'Samenvatting' en de structuur 'Nieuwsartikel'. Implementeer met `impl Summary for News Article`het klonen van het veld`self.headline.clone()`.

Oplossing beschikbaar na 3 pogingen

Oefening 2: Eigenschapsgrenzen met print_summary

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

Definieer op basis van de code uit de vorige oefening een generieke functie met de naam print_summary<T> die een parameteritem van het type &T accepteert. Pas een eigenschapsgrens toe zodat T de samenvattingseigenschap moet implementeren. Binnen de functie drukt u het resultaat af dat wordt geretourneerd door item.summarize().

Editor laden…
Toon hint

Gebruik de handtekening `fn print_summary<T: Summary>(item: &T)`en roep `item.summarize()`aan binnen`println!`.

Oplossing beschikbaar na 3 pogingen

Oefening 3: Oppervlakteberekening met behulp van eigenschappen

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

Definieer een eigenschap met de naam Area met de methode fn area(&self) -> f64;. Maak een structuurcirkel met daarin een straalveld van het type f64, en implementeer daarvoor de eigenschap Area door het gebied te berekenen (formule: straal * straal * 3,14159).

Editor laden…
Toon hint

Definieer de eigenschap 'Gebied' en de 'Cirkel'-structuur. Implementeer`area(&self)` met behulp van de formule voor het cirkelgebied.

Oplossing beschikbaar na 3 pogingen