Podsumowanie — generyczna drukarka
Część sekcji Programowanie obiektowe ścieżki Rust w Coddy. Lekcja 44 z 61.
Wyzwanie
ŁatwyZbudujmy 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 traitPrintablez metodąprint_info, która przyjmuje&selfi zwracaString. Następnie utwórz publiczną funkcję generyczną o nazwieannounce, która przyjmuje dowolny typTimplementującyPrintable. Ta funkcja powinna wypisywaćAnnouncement: {info}, gdzie{info}jest wynikiem wywołaniaprint_info()dla elementu.main.rs: Utwórz dwie publiczne struktury implementującePrintable:Person: z publicznym polemname(String). Jej metodaprint_infopowinna zwracaćPerson: {name}Product: z publicznymi polaminame(String) iprice(f64). Jej metodaprint_infopowinna zwracaćProduct: {name} - ${price}
announcedla każdego z nich, aby pokazać, że Twoja funkcja generyczna działa z dowolnym typemPrintable.
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.99Otrzymasz 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
1Metody i zachowanie
Wprowadzenie do bloków implementacjiParametr selfMetody modyfikująceFunkcje powiązaneWiele bloków implementacjiŁańcuchowe wywoływanie metodPowtórzenie — działania na prostokącie4Projekt: Wirtualne zwierzątko
Definiowanie zwierzątkaKarmienie zwierzątka7Standardowe cechy
Cecha DebugCecha DisplayClone i CopyCechy równościPowtórka – punkt do wydrukowania10Projekt: System dokumentów
Trait DrawKomponent tekstowy2Hermetyzacja i moduły
Podstawy modułówSłowo kluczowe publicPola prywatneGetterySetteryPodsumowanie — bezpieczna skrytka5Typy generyczne
Struktury generyczneMetody generyczneWiele typów generycznychFunkcje generycznePodsumowanie – punkt współrzędnych8Cechy jako ograniczenia
Składnia ograniczeń cechWiele ograniczeńKlauzula whereZwracanie typów z użyciem cechPodsumowanie — generyczna drukarka11Wzorce projektowe w Rust
Wzorzec NewtypeKompozycjaTrait DropFrom i IntoPodsumowanie — atrapowy inteligentny wskaźnik3Zaawansowane typy wyliczeniowe
Typy wyliczeniowe z danymiMetody typów wyliczeniowychDopasowywanie wariantów danychTyp wyliczeniowy Option — powtórzeniePodsumowanie — typ wyliczeniowy Shape6Definiowanie cech
Czym jest cecha?Implementowanie cechImplementacje domyślneNadpisywanie wartości domyślnychCechy z parametramiPowtórzenie — odtwarzacz multimedialnyPoćwicz samodzielnie: Kompilator Rust online