Menu
Coddy logo textTech

Das Screen-Struct

Teil des Abschnitts Object Oriented Programming der Rust-Journey von Coddy — Lektion 52 von 61.

challenge icon

Aufgabe

Einfach

Jetzt ist es an der Zeit, all Ihre UI-Komponenten zusammenzuführen! Sie werden ein Screen-Struct erstellen, das eine Sammlung verschiedener zeichenbarer Komponenten mithilfe von Trait-Objekten aufnehmen kann. Hier zeigt sich die Stärke von Vec<Box<dyn Draw>> – eine einzige Sammlung, die mehrere Komponententypen verwaltet.

Sie werden Ihrem wachsenden Projekt ein neues Modul hinzufügen:

  • draw.rs: Ihr Draw-Trait aus den vorherigen Aufgaben.
  • text_field.rs: Ihre TextField-Komponente, die "Text: {}" ausgibt.
  • button.rs: Ihre Button-Komponente, die "Button: {} (width: {})" ausgibt.
  • screen.rs: Erstellen Sie ein Screen-Struct, das ein öffentliches Feld components vom Typ Vec<Box<dyn Draw>> besitzt. Implementieren Sie eine assoziierte Funktion new, die einen leeren Bildschirm erstellt, und eine add-Methode, die ein Box<dyn Draw> entgegennimmt und es dem Komponenten-Vektor hinzufügt.
  • main.rs: Führen Sie alle Module zusammen. Erstellen Sie einen Screen, fügen Sie ein TextField und einen Button hinzu, iterieren Sie dann durch die Komponenten des Bildschirms und rufen Sie für jede draw() auf.

Ihr Screen muss Trait-Objekte speichern, daher verwenden Sie das Schlüsselwort dyn mit Ihrem Draw-Trait. Die add-Methode sollte &mut self entgegennehmen, da sie den Komponenten-Vektor verändert.

Die folgenden Eingaben werden bereitgestellt:

  • Erste Zeile: der Inhalt des Textfeldes
  • Zweite Zeile: die Beschriftung (Label) des Buttons
  • Dritte Zeile: die Breite (Width) des Buttons (als Zahl)

Ihre Ausgabe sollte jede Komponente in einer eigenen Zeile anzeigen, in der Reihenfolge, in der sie hinzugefügt wurden:

Text: Hello
Button: Click Me (width: 80)

Probier es selbst

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: Erstelle einen Screen mit Screen::new()
    // TODO: Füge dem Screen ein in Box::new() verpacktes TextField hinzu
    // TODO: Füge dem Screen einen in Box::new() verpackten Button hinzu
    // TODO: Iteriere über screen.components und rufe draw() für jede Komponente auf
}

Alle Lektionen in Object Oriented Programming