Was ist ein Trait?
Teil des Abschnitts Objektorientierte Programmierung der Rust-Journey von Coddy. Lektion 29 von 61.
Generics ermöglichen es dir, Code zu schreiben, der mit jedem Typ funktioniert, aber manchmal musst du garantieren, dass ein Typ etwas Bestimmtes kann. Hier kommen Traits ins Spiel.
Ein Trait definiert eine Reihe von Methoden, die ein Typ implementieren muss. Stell es dir als einen Vertrag vor: Jeder Typ, der diesen Vertrag „unterschreibt“, verspricht, das angegebene Verhalten bereitzustellen. Wenn du in anderen Sprachen Interfaces verwendet hast, erfüllen Traits einen ähnlichen Zweck.
So definierst du ein Trait:
trait Describable {
fn describe(&self) -> String;
}
Das Schlüsselwort trait führt das Trait ein, gefolgt von seinem Namen. Innerhalb der geschweiften Klammern deklarierst du Methodensignaturen – lediglich den Namen, die Parameter und den Rückgabetyp, ohne Rumpf. Das Semikolon nach der Signatur zeigt an, dass es sich um eine Anforderung und nicht um eine Implementierung handelt.
Dieses Describable-Trait besagt: „Jeder Typ, der mich implementiert, muss eine describe-Methode bereitstellen, die eine Referenz auf sich selbst entgegennimmt und einen String zurückgibt.“ Das Trait kümmert sich nicht darum, wie die Methode funktioniert: Das bleibt jedem Typ überlassen, der es implementiert.
Traits werden mächtig, wenn mehrere unterschiedliche Typen dasselbe Trait implementieren. Ein Book, ein Car und eine Person könnten alle Describable sein, wobei jedes seine eigene einzigartige Beschreibung bereitstellt. Das Trait garantiert, dass sie alle diese gemeinsame Fähigkeit besitzen.
Aufgabe
EinfachDefinieren wir dein erstes Trait! Ein Trait legt einen Vertrag fest: ein Versprechen, dass jeder Typ, der es implementiert, ein bestimmtes Verhalten bereitstellt. Du erstellst ein Summarizable-Trait, das verschiedene Typen implementieren können, um eine Zusammenfassung ihrer selbst bereitzustellen.
Du wirst deinen Code auf zwei Dateien verteilen:
summary.rs: Definiere ein öffentliches Trait namensSummarizablemit einer einzigen Methodensignatur:summarize(&self) -> String. Denke daran: In einer Trait-Definition deklarierst du nur die Methodensignatur mit einem Semikolon: ohne Rumpf. Dadurch wird Rust mitgeteilt: „Jeder Typ, der dieses Trait implementiert, muss einesummarize-Methode bereitstellen, die einenStringzurückgibt.“main.rs: Binde dein Summary-Modul ein und gib eine Nachricht aus, die bestätigt, dass dein Trait definiert ist. Da wir noch nicht gelernt haben, wie man Traits implementiert (das ist die nächste Lektion!), überprüfst du einfach, dass dein Trait korrekt kompiliert.
Gib in deiner Hauptdatei die folgende Nachricht aus, um zu bestätigen, dass deine Trait-Definition gültig ist:
Summarizable trait defined successfully!Diese Herausforderung konzentriert sich ausschließlich auf die Syntax der Trait-Definition: das Schlüsselwort trait, den Namen des Traits und das Deklarieren von Methodensignaturen ohne Implementierungen. In der nächsten Lektion lernst du, wie Structs dieses Trait implementieren können!
Probier es selbst
mod summary;
fn main() {
// TODO: Gib die Bestätigungsnachricht aus, dass der Trait definiert ist
// Expected output: "Summarizable trait defined successfully!"
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Methoden und Verhalten
Einführung in ImplementierungsblöckeDer Self-ParameterVeränderliche MethodenAssoziierte FunktionenMehrere ImplementierungsblöckeMethod ChainingRückblick – Rechteck-Aktionen4Projekt: Virtuelles Haustier
Das Haustier definierenDas Haustier füttern7Standard-Traits
Das Debug-TraitDas Display-TraitClone und CopyGleichheits-TraitsZusammenfassung – Druckbarer Punkt10Projekt: Dokumentensystem
Das Draw-TraitText-Komponente2Kapselung und Module
Grundlagen der ModuleDas Public-SchlüsselwortPrivate FelderGetterSetterWiederholung – Sicherer Tresor5Generics
Generische StructsGenerische MethodenMehrere generische TypenGenerische FunktionenZusammenfassung - Koordinatenpunkt8Traits als Einschränkungen
Syntax für Trait BoundsMehrfache BoundsDie Where-KlauselTypen mit Traits zurückgebenRückblick – Generischer Drucker11Design Patterns in Rust
Newtype-PatternKompositionDas Drop-TraitFrom und IntoZusammenfassung – Smart Pointer Mock3Fortgeschrittene Enums
Enums mit DatenMethoden für EnumsMatching von DatenvariantenDas Option-Enum erneut betrachtetZusammenfassung – Shape-Enum6Definition von Traits
Was ist ein Trait?Traits implementierenStandardimplementierungenStandardimplementierungen überschreibenTraits mit ParameternZusammenfassung – Media PlayerÜbe selbstständig: Online-Rust-Compiler