Menu
Coddy logo textTech

Rückblick – Generischer Drucker

Teil des Abschnitts Objektorientierte Programmierung der Rust-Journey von Coddy. Lektion 44 von 61.

challenge icon

Aufgabe

Einfach

Lass 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 öffentlichen Printable-Trait mit einer print_info-Methode, die &self übernimmt und einen String zurückgibt. Erstelle anschließend 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() für das Element ist.
  • main.rs: Erstelle zwei öffentliche Structs, die Printable implementieren:
    • Person: mit einem öffentlichen Feld name (String). Die Methode print_info soll Person: {name} zurückgeben.
    • Product: mit den öffentlichen Feldern name (String) und price (f64). Die Methode print_info soll Product: {name} - ${price} zurückgeben.
    Binde dein printable-Modul ein, verwende die Eingaben, um eine Person und ein Produkt zu erstellen, und rufe dann announce für beide auf, um zu zeigen, dass deine generische Funktion mit jedem Printable-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.99

Du 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

Übe selbstständig: Online-Rust-Compiler