Menu
Coddy logo textTech

Uruchamianie ekranu

Część sekcji Programowanie obiektowe ścieżki Rust w Coddy. Lekcja 53 z 61.

challenge icon

Wyzwanie

Łatwy

Gratulacje, 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 trait Draw z metodą draw.
  • text_field.rs: Twój komponent TextField, który wyświetla Text: {content}.
  • button.rs: Twój komponent Button, który wyświetla Button: {label} (width: {width}).
  • screen.rs: Twoja struktura Screen z metodami new i add. Dodaj metodę run, która przyjmuje &self i wywołuje draw() dla każdego komponentu w kolekcji.
  • main.rs: Połącz wszystko: utwórz Screen, dodaj swoje komponenty i wywołaj run(), 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

Poćwicz samodzielnie: Kompilator Rust online