Katalog biblioteczny
Część sekcji Programowanie obiektowe ścieżki Rust w Coddy. Lekcja 60 z 61.
Wyzwanie
ŁatwyZbudujmy system katalogu bibliotecznego, który pokazuje, jak cechy łączą różne typy we wspólnym interfejsie! Utworzysz katalog, w którym książki i czasopisma, mimo różnych właściwości, mogą opisywać się za pomocą wspólnej cechy.
Uporządkujesz kod w trzech plikach:
catalog.rs: Zdefiniuj cechęCatalogItemz jedną metodądescription, która zwraca wartość typuString. Ta cecha określa wymagania, które muszą spełniać wszystkie pozycje biblioteczne.items.rs: Utwórz dwie struktury implementujące tę cechę.Bookma polatitleiauthor(oba typu String), natomiastMagazinema polename(typu String) oraz numerissue(typu u32). Każda struktura powinna implementowaćCatalogItemi mieć własny, unikalny format opisu.main.rs: Zaimportuj oba moduły i utwórz instancje Book i Magazine, używając podanych danych wejściowych. Wywołaj metodędescriptiondla każdej pozycji i wypisz wyniki.
Opis obiektu Book powinien mieć następujący format:
Book: {title} by {author}Opis obiektu Magazine powinien mieć następujący format:
Magazine: {name}, Issue {issue}Na przykład dla danych wejściowych 1984, George Orwell, Nature i 42:
Book: 1984 by George Orwell
Magazine: Nature, Issue 42A dla danych wejściowych The Rust Book, Steve Klabnik, Science Weekly i 156:
Book: The Rust Book by Steve Klabnik
Magazine: Science Weekly, Issue 156Otrzymasz cztery dane wejściowe: tytuł książki, autora książki, nazwę czasopisma i numer wydania czasopisma (ostatnią wartość sparsuj jako u32).
Spróbuj swoich sił
mod catalog;
mod items;
use catalog::CatalogItem;
use items::{Book, Magazine};
fn main() {
// Wczytaj dane wejściowe
let mut book_title = String::new();
std::io::stdin().read_line(&mut book_title).expect("Failed to read line");
let book_title = book_title.trim().to_string();
let mut book_author = String::new();
std::io::stdin().read_line(&mut book_author).expect("Failed to read line");
let book_author = book_author.trim().to_string();
let mut magazine_name = String::new();
std::io::stdin().read_line(&mut magazine_name).expect("Failed to read line");
let magazine_name = magazine_name.trim().to_string();
let mut issue_input = String::new();
std::io::stdin().read_line(&mut issue_input).expect("Failed to read line");
let magazine_issue: u32 = issue_input.trim().parse().expect("Failed to parse issue number");
// TODO: Utwórz instancję Book, używając book_title i book_author
// TODO: Utwórz instancję Magazine, używając magazine_name i magazine_issue
// TODO: Wywołaj description() dla każdego elementu i wypisz wyniki
}
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