Menu
Coddy logo textTech

Button-Komponente

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

challenge icon

Aufgabe

Einfach

Lassen Sie uns unser Dokumentensystem weiter ausbauen, indem wir eine zweite UI-Komponente hinzufügen: einen Button. Genau wie das TextField wird diese Komponente das Draw-Trait implementieren und so demonstrieren, wie verschiedene Typen eine gemeinsame Schnittstelle teilen können.

Sie werden Ihr Projekt um eine weitere Moduldatei erweitern:

  • draw.rs: Behalten Sie Ihr Draw-Trait aus den vorherigen Herausforderungen bei.
  • text_field.rs: Behalten Sie Ihr TextField-Struct und dessen Draw-Implementierung bei.
  • button.rs: Erstellen Sie ein Button-Struct mit zwei öffentlichen Feldern: label (ein String) und width (ein u32). Implementieren Sie das Draw-Trait für Button, sodass der Aufruf von draw() den Button in diesem Format ausgibt: Button: {label} (width: {width})
  • main.rs: Binden Sie alle drei Module ein. Erstellen Sie sowohl ein TextField als auch einen Button und rufen Sie dann für beide draw() auf, um beide Komponenten zu rendern.

Ihr button-Modul muss auf das Draw-Trait über crate::draw::Draw zugreifen, genau wie Sie es beim TextField getan haben.

Die folgenden Eingaben werden bereitgestellt:

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

Ihre Ausgabe sollte zuerst das Textfeld und dann den Button anzeigen, jeweils in einer eigenen Zeile:

Text: Welcome
Button: Submit (width: 100)

Probier es selbst

mod draw;
mod text_field;
mod button;

use draw::Draw;
use text_field::TextField;
use button::Button;

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 text_field = TextField { content };
    text_field.draw();

    // TODO: Erstelle einen Button mit `label` und `width`, rufe dann draw() auf
    
}

Alle Lektionen in Object Oriented Programming