Menu
Coddy logo textTech

Den Screen ausführen

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

challenge icon

Aufgabe

Einfach

Herzlichen Glückwunsch zum Erreichen des letzten Schritts des Document System-Projekts! Sie haben alle Einzelteile erstellt – das Draw-Trait, TextField, Button und Screen. Jetzt ist es an der Zeit, Ihrem Screen die Fähigkeit zu geben, alle seine Komponenten gleichzeitig mit einem einzigen Methodenaufruf zu rendern.

Sie werden Ihr Projekt abschließen, indem Sie der Screen-Struktur eine run-Methode hinzufügen. Diese Methode wird alle im Screen gespeicherten Komponenten durchlaufen und für jede draw() aufrufen, wodurch Ihr gesamtes Dokumentensystem zum Leben erweckt wird.

Ihre Projektdateien:

  • draw.rs: Ihr Draw-Trait mit der draw-Methode.
  • text_field.rs: Ihre TextField-Komponente, die "Text: {}" ausgibt.
  • button.rs: Ihre Button-Komponente, die "Button: {} (width: {})" ausgibt.
  • screen.rs: Ihre Screen-Struktur mit den Methoden new und add. Fügen Sie eine run-Methode hinzu, die &self entgegennimmt und draw() für jede Komponente in der Sammlung aufruft.
  • main.rs: Bringen Sie alles zusammen – erstellen Sie einen Screen, fügen Sie Ihre Komponenten hinzu und rufen Sie run() auf, um den gesamten Bildschirm in einem Durchgang zu rendern.

Die run-Methode kapselt die Rendering-Logik innerhalb von Screen, wodurch Ihre Hauptfunktion sauber und einfach bleibt. Anstatt die Komponenten in main manuell zu durchlaufen, rufen Sie einfach screen.run() auf.

Die folgenden Eingaben werden bereitgestellt:

  • Erste Zeile: der Inhalt des Textfeldes (content)
  • Zweite Zeile: die Beschriftung des Buttons (label)
  • Dritte Zeile: die Breite des Buttons (width) (als Zahl)

Ihre Ausgabe sollte jede Komponente in einer eigenen Zeile anzeigen, in der Reihenfolge, 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 einzigen Aufruf von screen.run()
    for component in &screen.components {
        component.draw();
    }
}

Alle Lektionen in Object Oriented Programming