Menu
Coddy logo textTech

Rückblick – Generischer Drucker

Teil des Abschnitts Object Oriented Programming der Rust-Journey von Coddy — Lektion 44 von 61.

challenge icon

Aufgabe

Einfach

Lassen 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 öffentlichen Printable-Trait mit einer print_info-Methode, die &self entgegennimmt und einen String zurückgibt. Erstellen Sie dann eine öffentliche generische Funktion namens announce, die jeden Typ T akzeptiert, der Printable implementiert. Diese Funktion soll Announcement: {info} ausgeben, wobei {info} das Ergebnis des Aufrufs von print_info() auf dem Element ist.
  • main.rs: Erstellen Sie zwei öffentliche Structs, die Printable implementieren:
    • Person — mit einem öffentlichen name-Feld (String). Die Methode print_info soll Person: {name} zurückgeben.
    • Product — mit öffentlichen Feldern name (String) und price (f64). Die Methode print_info soll Product: {name} - ${price} zurückgeben.
    Binden Sie Ihr printable-Modul ein, verwenden Sie die Eingaben, um eine Person und ein Produkt zu erstellen, und rufen Sie dann announce für jedes auf, um zu demonstrieren, dass Ihre generische Funktion mit jedem Printable-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.99

Sie 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