Lektionen des Moduls (2/2)
Traits und Trait Bounds
Traits definieren das Verhalten, das ein bestimmter Typ besitzt und mit anderen Typen teilen kann. Wir können Traits verwenden, um eine Reihe von Methoden zu definieren, die eine bestimmte gemeinsame Funktionalität oder Schnittstelle darstellen, ähnlich wie Interfaces in anderen Programmiersprachen.
Trait Bounds (Trait-Einschränkungen) ermöglichen es zu spezifizieren, dass ein generischer Typ ein bestimmtes Trait implementieren muss. Dadurch wird sichergestellt, dass die erforderlichen Methoden zur Kompilierzeit verfügbar sind.
Definieren und Implementieren eines Traits
Um ein Trait zu definieren, verwenden wir das Schlüsselwort trait, gefolgt von den Signaturen der Methoden, die die Typen implementieren müssen:
pub trait Summary {
fn summarize(&self) -> String;
}
Um ein Trait für einen konkreten Typ zu implementieren, verwenden wir die Syntax impl TraitName for TypeName:
pub struct NewsArticle {
pub headline: String,
pub content: String,
}
impl Summary for NewsArticle {
fn summarize(&self) -> String {
format!("{}", self.headline)
}
}
Trait Bounds (Trait-Einschränkungen)
Wenn wir generische Funktionen schreiben, können wir die Typparameter einschränken, um sicherzustellen, dass sie ein bestimmtes Trait implementieren. Die Standard-Syntax lautet <T: Trait>:
pub fn notify<T: Summary>(item: &T) {
println!("Notifica: {}", item.summarize());
}
Alternativ können wir für komplexere Signaturen die where-Klausel verwenden:
pub fn notify_advanced<T>(item: &T)
where
T: Summary
{
println!("Notifica: {}", item.summarize());
}
Probier es aus
Esercizio 1: Das Trait Summary
Definiere ein Trait namens Summary, das die Signatur der Methode fn summarize(&self) -> String; enthält. Definiere anschließend eine Struct NewsArticle mit einem Feld headline vom Typ String und implementiere das Trait Summary für diese Struct, sodass die Methode summarize den Wert des Feldes headline zurückgibt.
Hinweis anzeigen
Definiere das Trait `Summary`und die Struct`NewsArticle`. Implementiere mit `impl Summary for NewsArticle`und klone das Feld mit`self.headline.clone()`.
Lösung nach 3 Versuchen verfügbar
Esercizio 2: Trait Bounds mit print_summary
Definiere basierend auf dem Code der vorherigen Aufgabe eine generische Funktion namens print_summary<T>, die einen Parameter item vom Typ &T akzeptiert. Wende eine Einschränkung (trait bound) an, sodass T das Trait Summary implementieren muss. Gib innerhalb der Funktion das Ergebnis von item.summarize() auf dem Bildschirm aus.
Hinweis anzeigen
Verwende die Signatur `fn print_summary<T: Summary>(item: &T)`und rufe`item.summarize()`innerhalb von`println!` auf.
Lösung nach 3 Versuchen verfügbar
Esercizio 3: Flächenberechnung mittels Trait
Definiere ein Trait namens Area mit der Methode fn area(&self) -> f64;. Erstelle eine Struct Circle mit einem Feld radius vom Typ f64 und implementiere das Trait Area für diese Struct, um die Fläche zu berechnen (Formel: radius * radius * 3.14159).
Hinweis anzeigen
Definiere das Trait `Area`und die Struct`Circle`. Implementiere `area(&self)` unter Verwendung der Kreisformel.
Lösung nach 3 Versuchen verfügbar