Menu
Coddy logo textTech

Den Screen ausführen

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

challenge icon

Aufgabe

Einfach

Herzlichen Glückwunsch, dass du den letzten Schritt des Document System-Projekts erreicht hast! Du hast alle einzelnen Teile erstellt: das Draw-Trait, TextField, Button und Screen. Jetzt ist es an der Zeit, deinem Screen die Fähigkeit zu geben, alle seine Komponenten gleichzeitig mit einem einzigen Methodenaufruf zu rendern.

Du schließt dein Projekt ab, indem du der Struktur run eine Screen-Methode hinzufügst. Diese Methode durchläuft alle im Bildschirm gespeicherten Komponenten und ruft für jede draw() auf, wodurch dein gesamtes Document System zum Leben erweckt wird.

Deine Projektdateien:

  • draw.rs: Dein Draw-Trait mit der draw-Methode.
  • text_field.rs: Deine TextField-Komponente, die Text: {content} ausgibt.
  • button.rs: Deine Button-Komponente, die Button: {label} (width: {width}) ausgibt.
  • screen.rs: Deine Struktur Screen mit den Methoden new und add. Füge eine run-Methode hinzu, die &self entgegennimmt und für jede Komponente in der Sammlung draw() aufruft.
  • main.rs: Führe alles zusammen: Erstelle einen Screen, füge deine Komponenten hinzu und rufe run() auf, um den gesamten Bildschirm auf einmal zu rendern.

Die run-Methode kapselt die Rendering-Logik innerhalb von Screen, wodurch deine Main-Funktion übersichtlich und einfach bleibt. Statt die Komponenten in main manuell zu durchlaufen, rufst du einfach screen.run() auf.

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: Dashboard
Button: Save (width: 120)

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");

    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: Ersetze die manuelle Iteration unten durch einen einzelnen Aufruf von screen.run()
    for component in &screen.components {
        component.draw();
    }
}

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-Rust-Compiler