Struktura Screen
Część sekcji Programowanie obiektowe ścieżki Rust w Coddy. Lekcja 52 z 61.
Wyzwanie
ŁatwyTeraz pora połączyć wszystkie komponenty interfejsu użytkownika! Utworzysz strukturę Screen, która może przechowywać kolekcję różnych komponentów, które można rysować, za pomocą obiektów cech. Właśnie tutaj widać prawdziwą moc Vec<Box<dyn Draw>>: jedna kolekcja zarządza wieloma typami komponentów.
Dodasz nowy moduł do swojego rozrastającego się projektu:
draw.rs: cechaDrawz poprzednich wyzwań.text_field.rs: komponentTextField, który wypisujeText: {content}.button.rs: komponentButton, który wypisujeButton: {label} (width: {width}).screen.rs: Utwórz strukturęScreen, która zawiera publiczne polecomponentstypuVec<Box<dyn Draw>>. Zaimplementuj funkcję stowarzyszonąnew, która tworzy pusty ekran, oraz metodęadd, która przyjmujeBox<dyn Draw>i dodaje go do wektora komponentów.main.rs: Połącz wszystkie moduły. UtwórzScreen, dodaj do niegoTextFieldiButton, a następnie przeiteruj po komponentach ekranu i wywołajdraw()dla każdego z nich.
Twój Screen musi przechowywać obiekty cech, więc użyjesz słowa kluczowego dyn z cechą Draw. Metoda add powinna przyjmować &mut self, ponieważ modyfikuje wektor komponentów.
Dane wejściowe będą następujące:
- Pierwszy wiersz: zawartość pola tekstowego
- Drugi wiersz: etykieta przycisku
- Trzeci wiersz: szerokość przycisku (jako liczba)
Wynik powinien wyświetlać każdy komponent w osobnym wierszu, w kolejności, w jakiej zostały dodane:
Text: Hello
Button: Click Me (width: 80)Spróbuj swoich sił
mod draw;
mod text_field;
mod button;
mod screen;
use draw::Draw;
use text_field::TextField;
use button::Button;
use screen::Screen;
pub struct Label {
pub text: String,
}
impl Draw for Label {
fn draw(&self) {
println!("{}", self.text);
}
}
fn main() {
let mut input1 = String::new();
std::io::stdin().read_line(&mut input1).expect("Failed to read line");
let content = input1.trim().to_string();
let mut input2 = String::new();
std::io::stdin().read_line(&mut input2).expect("Failed to read line");
let label = input2.trim().to_string();
let mut input3 = String::new();
std::io::stdin().read_line(&mut input3).expect("Failed to read line");
let width: u32 = input3.trim().parse().expect("Failed to parse width");
// TODO: Utwórz Screen za pomocą Screen::new()
// TODO: Dodaj do ekranu TextField opakowany w Box::new()
// TODO: Dodaj do ekranu Button opakowany w Box::new()
// TODO: Przejdź po screen.components i wywołaj draw() dla każdego komponentu
}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