Direkt zum Hauptinhalt springen
eLearner.app
Modul 5 · Lektion 2 von 210/14 im Kurs~15 min
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:

Code
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:

Code
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>:

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

Alternativ können wir für komplexere Signaturen die where-Klausel verwenden:

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

Probier es aus

Esercizio 1: Das Trait Summary

Übung#rust.m5.l2.e1
Versuche: 0Wird geladen…

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.

Editor wird geladen…
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

Übung#rust.m5.l2.e2
Versuche: 0Wird geladen…

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.

Editor wird geladen…
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

Übung#rust.m5.l2.e3
Versuche: 0Wird geladen…

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).

Editor wird geladen…
Hinweis anzeigen

Definiere das Trait `Area`und die Struct`Circle`. Implementiere `area(&self)` unter Verwendung der Kreisformel.

Lösung nach 3 Versuchen verfügbar