Uruchamianie ekranu
Część sekcji Programowanie obiektowe ścieżki Rust w Coddy. Lekcja 53 z 61.
Wyzwanie
ŁatwyGratulacje, udało Ci się dotrzeć do ostatniego kroku projektu Systemu dokumentów! Zbudowałeś wszystkie poszczególne elementy: trait Draw, TextField, Button i Screen. Teraz czas nadać Twojemu Screen możliwość renderowania wszystkich swoich komponentów naraz za pomocą jednego wywołania metody.
Ukończysz projekt, dodając metodę run do struktury Screen. Ta metoda przejdzie przez wszystkie komponenty przechowywane na ekranie i wywoła draw() dla każdego z nich, ożywiając cały Twój system dokumentów.
Pliki projektu:
draw.rs: Twój traitDrawz metodądraw.text_field.rs: Twój komponentTextField, który wyświetlaText: {content}.button.rs: Twój komponentButton, który wyświetlaButton: {label} (width: {width}).screen.rs: Twoja strukturaScreenz metodaminewiadd. Dodaj metodęrun, która przyjmuje&selfi wywołujedraw()dla każdego komponentu w kolekcji.main.rs: Połącz wszystko: utwórzScreen, dodaj swoje komponenty i wywołajrun(), aby wyrenderować cały ekran za jednym razem.
Metoda run zawiera logikę renderowania wewnątrz Screen, dzięki czemu Twoja funkcja main jest przejrzysta i prosta. Zamiast ręcznie przechodzić przez komponenty w main, po prostu wywołujesz screen.run().
Przekazane zostaną następujące dane wejściowe:
- Pierwszy wiersz: zawartość pola tekstowego
- Drugi wiersz: etykieta przycisku
- Trzeci wiersz: szerokość przycisku (jako liczba)
Wyjście powinno wyświetlać każdy komponent w osobnym wierszu, w kolejności, w jakiej zostały dodane:
Text: Dashboard
Button: Save (width: 120)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");
let mut screen = Screen::new();
let text_field = TextField { content };
screen.add(Box::new(text_field));
let button = Button { label, width };
screen.add(Box::new(button));
// TODO: Zastąp poniższą ręczną iterację jednym wywołaniem screen.run()
for component in &screen.components {
component.draw();
}
}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