Menu
Coddy logo textTech

Podsumowanie — generyczna drukarka

Część sekcji Programowanie obiektowe ścieżki Rust w Coddy. Lekcja 44 z 61.

challenge icon

Wyzwanie

Łatwy

Zbudujmy elastyczny system ogłoszeń, który pokazuje możliwości ograniczeń traitów! Utworzysz trait Printable oraz funkcję generyczną, która może ogłaszać dowolny typ implementujący ten trait: zobaczysz, jak generyki i traity współpracują ze sobą, umożliwiając tworzenie wielokrotnego użytku i bezpiecznego typowo kodu.

Rozmieścisz kod w dwóch plikach:

  • printable.rs: Zdefiniuj publiczny trait Printable z metodą print_info, która przyjmuje &self i zwraca String. Następnie utwórz publiczną funkcję generyczną o nazwie announce, która przyjmuje dowolny typ T implementujący Printable. Ta funkcja powinna wypisywać Announcement: {info}, gdzie {info} jest wynikiem wywołania print_info() dla elementu.
  • main.rs: Utwórz dwie publiczne struktury implementujące Printable:
    • Person: z publicznym polem name (String). Jej metoda print_info powinna zwracać Person: {name}
    • Product: z publicznymi polami name (String) i price (f64). Jej metoda print_info powinna zwracać Product: {name} - ${price}
    Dołącz moduł printable, użyj danych wejściowych, aby utworzyć obiekt Person i Product, a następnie wywołaj announce dla każdego z nich, aby pokazać, że Twoja funkcja generyczna działa z dowolnym typem Printable.

Zaletą tego rozwiązania jest to, że announce nie ma znaczenia, czy otrzyma obiekt Person, Product, czy dowolny przyszły typ. Wymaga jedynie, aby typ mógł udostępnić informacje za pomocą print_info(). Ograniczenie traitu gwarantuje to podczas kompilacji.

Wynik powinien zawierać oba ogłoszenia:

Announcement: Person: {name}
Announcement: Product: {product_name} - ${price}

Na przykład dla danych wejściowych Alice, Laptop i 999.99:

Announcement: Person: Alice
Announcement: Product: Laptop - $999.99

Otrzymasz trzy dane wejściowe: imię i nazwisko osoby, nazwę produktu oraz cenę produktu (przekonwertuj ją na f64).

Spróbuj swoich sił

mod printable;

use printable::{Printable, announce};

// TODO: Zdefiniuj publiczną strukturę Person z publicznym polem name (String)
// Zaimplementuj cechę Printable dla Person
// print_info powinno zwracać "Person: {name}"

// TODO: Zdefiniuj publiczną strukturę Product z publicznymi polami name (String) i price (f64)
// Zaimplementuj cechę Printable dla Product
// print_info powinno zwracać "Product: {name} - ${price}"

fn main() {
    // Wczytaj dane wejściowe
    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: Utwórz instancję Person z person_name

    // TODO: Utwórz instancję Product z product_name i price

    // TODO: Wywołaj announce z instancją Person

    // TODO: Wywołaj announce z instancją Product
}

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Rust online