Menu
Coddy logo textTech

Das Screen-Struct

Teil des Abschnitts Objektorientierte Programmierung der Rust-Journey von Coddy. Lektion 52 von 61.

challenge icon

Aufgabe

Einfach

Jetzt ist es an der Zeit, alle deine UI-Komponenten zusammenzubringen! Du erstellst eine Screen-Struktur, die mithilfe von Trait-Objekten eine Sammlung verschiedener zeichbarer Komponenten aufnehmen kann. Hier kommt die Stärke von Vec<Box<dyn Draw>> wirklich zur Geltung: eine Sammlung, die mehrere Komponententypen verwaltet.

Du fügst deinem wachsenden Projekt ein neues Modul hinzu:

  • draw.rs: Dein Draw-Trait aus den vorherigen Aufgaben.
  • text_field.rs: Deine TextField-Komponente, die Text: {content} ausgibt.
  • button.rs: Deine Button-Komponente, die Button: {label} (width: {width}) ausgibt.
  • screen.rs: Erstelle eine Screen-Struktur, die ein öffentliches Feld components vom Typ Vec<Box<dyn Draw>> enthält. Implementiere eine zugehörige Funktion new, die einen leeren Bildschirm erstellt, sowie eine Methode add, die ein Box<dyn Draw> entgegennimmt und es zum Komponentenvektor hinzufügt.
  • main.rs: Führe alle Module zusammen. Erstelle einen Screen, füge ihm ein TextField und einen Button hinzu, durchlaufe anschließend die Komponenten des Bildschirms und rufe für jede davon draw() auf.

Dein Screen muss Trait-Objekte speichern, daher verwendest du das Schlüsselwort dyn mit deinem Draw-Trait. Die Methode add sollte &mut self entgegennnehmen, da sie den Komponentenvektor verändert.

Die folgenden Eingaben werden bereitgestellt:

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

Deine Ausgabe sollte jede Komponente in einer eigenen Zeile und in der Reihenfolge anzeigen, 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 ein in Box::new() verpacktes TextField zum Screen hinzu
    // TODO: Füge einen in Box::new() verpackten Button zum Screen hinzu
    // TODO: Iteriere über screen.components und rufe draw() für jede Komponente auf
}

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-Rust-Compiler