Podsumowanie – zarządzanie zoo
Część sekcji Programowanie obiektowe ścieżki Rust w Coddy. Lekcja 48 z 61.
Wyzwanie
ŁatwyZbudujmy menedżera zoo, który łączy wszystkie poznane przez Ciebie koncepcje obiektów cech! Stworzysz system, w którym różne zwierzęta, każde z własnym, wyjątkowym głosem, można przechowywać w jednej kolekcji i sprawiać, by odzywały się jedno po drugim.
Rozmieścisz kod w dwóch plikach:
animals.rs: Zdefiniuj publiczną cechęSpeakz metodąspeak, która przyjmuje&selfi zwracaString. Następnie utwórz trzy publiczne struktury:Dog,CatiBird, każdą z publicznym polemname(String). Zaimplementuj cechęSpeakdla każdego zwierzęcia, używając charakterystycznych dla niego odgłosów:- Dog powinien zwracać
{name} says: Woof! - Cat powinien zwracać
{name} says: Meow! - Bird powinien zwracać
{name} says: Tweet!
- Dog powinien zwracać
main.rs: Dodaj moduł zwierząt i utwórz zoo! Zbuduj kolekcjęVec<Box<dyn Speak>>, zawierającą po jednym zwierzęciu każdego typu, korzystając z podanych danych wejściowych. Dodaj je w kolejności: najpierw Dog, potem Cat, a następnie Bird. Na koniec przejdź przez swoje zoo i wypisz odgłos każdego zwierzęcia w osobnym wierszu.
To wyzwanie pokazuje prawdziwą moc obiektów cech: trzy zupełnie różne typy zwierząt żyją razem w jednej kolekcji, a każde z nich reaguje na to samo wywołanie speak() we właściwy sobie sposób.
Twój wynik powinien wyświetlać odgłosy zwierząt w podanej kolejności:
{dog_name} says: Woof!
{cat_name} says: Meow!
{bird_name} says: Tweet!Na przykład dla danych wejściowych Rex, Whiskers i Tweety:
Rex says: Woof!
Whiskers says: Meow!
Tweety says: Tweet!Otrzymasz trzy dane wejściowe: imię psa, imię kota i imię ptaka.
Spróbuj swoich sił
mod animals;
use animals::{Speak, Dog, Cat, Bird};
fn main() {
// Wczytaj nazwy zwierząt
let mut dog_name = String::new();
std::io::stdin().read_line(&mut dog_name).expect("Failed to read line");
let dog_name = dog_name.trim().to_string();
let mut cat_name = String::new();
std::io::stdin().read_line(&mut cat_name).expect("Failed to read line");
let cat_name = cat_name.trim().to_string();
let mut bird_name = String::new();
std::io::stdin().read_line(&mut bird_name).expect("Failed to read line");
let bird_name = bird_name.trim().to_string();
// TODO: Utwórz Vec<Box<dyn Speak>> o nazwie zoo
// Dodaj zwierzęta w kolejności: najpierw Dog, potem Cat, a na końcu Bird
// TODO: Przejdź po zoo i wypisz dźwięk wydawany przez każde zwierzę
}
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 multimedialny9Obiekty cech
Dynamiczne wywołanieWektory obiektów cechIterowanie po obiektach cechPodsumowanie – zarządzanie zooPoćwicz samodzielnie: Kompilator Rust online