Rückblick – Generischer Drucker
Teil des Abschnitts Object Oriented Programming der Rust-Journey von Coddy — Lektion 44 von 61.
Aufgabe
EinfachLassen Sie uns ein flexibles Ankündigungssystem bauen, das die Stärke von Trait-Bounds demonstriert! Sie werden einen Printable-Trait und eine generische Funktion erstellen, die jeden Typ ankündigen kann, der diesen Trait implementiert – so zeigen Sie, wie Generics und Traits zusammenarbeiten, um wiederverwendbaren, typsicheren Code zu erstellen.
Sie werden Ihren Code über zwei Dateien organisieren:
printable.rs: Definieren Sie einen öffentlichenPrintable-Trait mit einerprint_info-Methode, die&selfentgegennimmt und einenStringzurückgibt. Erstellen Sie dann eine öffentliche generische Funktion namensannounce, die jeden TypTakzeptiert, derPrintableimplementiert. Diese Funktion sollAnnouncement: {info}ausgeben, wobei{info}das Ergebnis des Aufrufs vonprint_info()auf dem Element ist.main.rs: Erstellen Sie zwei öffentliche Structs, diePrintableimplementieren:Person— mit einem öffentlichenname-Feld (String). Die Methodeprint_infosollPerson: {name}zurückgeben.Product— mit öffentlichen Feldernname(String) undprice(f64). Die Methodeprint_infosollProduct: {name} - ${price}zurückgeben.
announcefür jedes auf, um zu demonstrieren, dass Ihre generische Funktion mit jedemPrintable-Typ funktioniert.
Das Schöne an diesem Design ist, dass es announce egal ist, ob es eine Person, ein Produkt oder einen zukünftigen Typ erhält – es setzt nur voraus, dass der Typ Informationen über print_info() bereitstellen kann. Der Trait-Bound garantiert dies zur Kompilierzeit.
Ihre Ausgabe sollte beide Ankündigungen zeigen:
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.99Sie erhalten drei Eingaben: den Namen der Person, den Produktnamen 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 das Printable Trait für Person
// print_info sollte "Person: {name}" zurückgeben
// TODO: Definiere eine öffentliche struct Product mit öffentlichen name (String) und price (f64) Feldern
// Implementiere das 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 Object Oriented Programming
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