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:
pub trait Summary {
fn summarize(&self) -> String;
}Om een eigenschap op een betontype te implementeren, gebruiken we de syntaxis impl TraitName for TypeName:
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>:
pub fn notify<T: Summary>(item: &T) {
println!("Notification: {}", item.summarize());
}Als alternatief kunnen we voor complexere handtekeningen de where clausule gebruiken:
pub fn notify_advanced<T>(item: &T)
where
T: Summary
{
println!("Notification: {}", item.summarize());
}Probeer het zelf
Oefening 1: De samenvattende eigenschap
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.
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
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().
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
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).
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