Menu
Coddy logo textTech

Struktura Screen

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

challenge icon

Wyzwanie

Łatwy

Teraz 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: cecha Draw z poprzednich wyzwań.
  • text_field.rs: komponent TextField, który wypisuje Text: {content}.
  • button.rs: komponent Button, który wypisuje Button: {label} (width: {width}).
  • screen.rs: Utwórz strukturę Screen, która zawiera publiczne pole components typu Vec<Box<dyn Draw>>. Zaimplementuj funkcję stowarzyszoną new, która tworzy pusty ekran, oraz metodę add, która przyjmuje Box<dyn Draw> i dodaje go do wektora komponentów.
  • main.rs: Połącz wszystkie moduły. Utwórz Screen, dodaj do niego TextField i Button, a następnie przeiteruj po komponentach ekranu i wywołaj draw() 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

Poćwicz samodzielnie: Kompilator Rust online