Rückblick – Generischer Drucker
Teil des Abschnitts Objektorientierte Programmierung der Rust-Journey von Coddy. Lektion 44 von 61.
Aufgabe
EinfachLass uns ein flexibles Ankündigungssystem erstellen, das die Leistungsfähigkeit von Trait-Bounds demonstriert! Du erstellst einen Printable-Trait und eine generische Funktion, die jeden Typ ankündigen kann, der diesen Trait implementiert: So wird gezeigt, wie Generics und Traits zusammenarbeiten, um wiederverwendbaren, typsicheren Code zu erstellen.
Du organisierst deinen Code über zwei Dateien:
printable.rs: Definiere einen öffentlichenPrintable-Trait mit einerprint_info-Methode, die&selfübernimmt und einenStringzurückgibt. Erstelle anschließend eine öffentliche generische Funktion namensannounce, die jeden TypTakzeptiert, derPrintableimplementiert. Diese Funktion sollAnnouncement: {info}ausgeben, wobei{info}das Ergebnis des Aufrufs vonprint_info()für das Element ist.main.rs: Erstelle zwei öffentliche Structs, diePrintableimplementieren:Person: mit einem öffentlichen Feldname(String). Die Methodeprint_infosollPerson: {name}zurückgeben.Product: mit den öffentlichen Feldernname(String) undprice(f64). Die Methodeprint_infosollProduct: {name} - ${price}zurückgeben.
announcefür beide auf, um zu zeigen, dass deine generische Funktion mit jedemPrintable-Typ funktioniert.
Das Schöne an diesem Design ist, dass es announce egal ist, ob es eine Person, ein Product oder einen zukünftigen Typ erhält. Es wird nur vorausgesetzt, dass der Typ über print_info() Informationen bereitstellen kann. Der Trait-Bound garantiert dies bereits zur Kompilierungszeit.
Deine Ausgabe sollte beide Ankündigungen enthalten:
Announcement: Person: {name}
Announcement: Product: {product_name} - ${price}Zum Beispiel mit den Eingaben Alice, Laptop und 999.99:
Announcement: Person: Alice
Announcement: Product: Laptop - $999.99Du erhältst drei Eingaben: den Namen der Person, den Namen des Produkts und den Produktpreis (als f64 parsen).
Probier es selbst
mod printable;
use printable::{Printable, announce};
// TODO: Definiere eine öffentliche struct Person mit einem öffentlichen name-Feld (String)
// Implementiere den Printable-Trait für Person
// print_info sollte "Person: {name}" zurückgeben
// TODO: Definiere eine öffentliche struct Product mit öffentlichen name- (String) und price-Feldern (f64)
// Implementiere den Printable-Trait für Product
// print_info sollte "Product: {name} - ${price}" zurückgeben
fn main() {
// Eingaben lesen
let mut person_name = String::new();
std::io::stdin().read_line(&mut person_name).expect("Failed to read line");
let person_name = person_name.trim().to_string();
let mut product_name = String::new();
std::io::stdin().read_line(&mut product_name).expect("Failed to read line");
let product_name = product_name.trim().to_string();
let mut price_input = String::new();
std::io::stdin().read_line(&mut price_input).expect("Failed to read line");
let price: f64 = price_input.trim().parse().expect("Failed to parse price");
// TODO: Erstelle eine Person-Instanz mit person_name
// TODO: Erstelle eine Product-Instanz mit product_name und price
// TODO: Rufe announce mit der Person auf
// TODO: Rufe announce mit dem Product auf
}
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