Button-Komponente
Teil des Abschnitts Objektorientierte Programmierung der Rust-Journey von Coddy. Lektion 51 von 61.
Aufgabe
EinfachFahren wir mit dem Aufbau unseres Dokumentensystems fort, indem wir eine zweite UI-Komponente hinzufügen: einen Button. Genau wie TextField wird diese Komponente das Draw-Trait implementieren und damit zeigen, wie verschiedene Typen eine gemeinsame Schnittstelle verwenden können.
Du erweiterst dein Projekt um eine weitere Moduldatei:
draw.rs: Behalte deinDraw-Trait aus den vorherigen Aufgaben bei.text_field.rs: Behalte deineTextField-Struktur und derenDraw-Implementierung bei.button.rs: Erstelle eineButton-Struktur mit zwei öffentlichen Feldern:label(einString) undwidth(einu32). Implementiere dasDraw-Trait fürButton, sodass der Aufruf vondraw()die Schaltfläche in diesem Format ausgibt:Button: {label} (width: {width})main.rs: Binde alle drei Module ein. Erstelle sowohl einTextFieldals auch einenButtonund rufe anschließend für jede Komponentedraw()auf, um beide Komponenten darzustellen.
Dein button-Modul muss mithilfe von Draw auf das crate::draw::Draw-Trait zugreifen, genau wie du es bei TextField gemacht hast.
Die folgenden Eingaben werden bereitgestellt:
- Erste Zeile: der Inhalt des Textfelds
- Zweite Zeile: die Beschriftung der Schaltfläche
- Dritte Zeile: die Breite der Schaltfläche (als Zahl)
Deine Ausgabe sollte zuerst das Textfeld und anschließend die Schaltfläche 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 Objektorientierte Programmierung
1Methoden und Verhalten
Einführung in ImplementierungsblöckeDer Self-ParameterVeränderliche MethodenAssoziierte FunktionenMehrere ImplementierungsblöckeMethod ChainingRückblick – Rechteck-Aktionen4Projekt: Virtuelles Haustier
Das Haustier definierenDas Haustier füttern7Standard-Traits
Das Debug-TraitDas Display-TraitClone und CopyGleichheits-TraitsZusammenfassung – Druckbarer Punkt10Projekt: Dokumentensystem
Das Draw-TraitText-Komponente2Kapselung und Module
Grundlagen der ModuleDas Public-SchlüsselwortPrivate FelderGetterSetterWiederholung – Sicherer Tresor5Generics
Generische StructsGenerische MethodenMehrere generische TypenGenerische FunktionenZusammenfassung - Koordinatenpunkt8Traits als Einschränkungen
Syntax für Trait BoundsMehrfache BoundsDie Where-KlauselTypen mit Traits zurückgebenRückblick – Generischer Drucker11Design Patterns in Rust
Newtype-PatternKompositionDas Drop-TraitFrom und IntoZusammenfassung – Smart Pointer Mock3Fortgeschrittene Enums
Enums mit DatenMethoden für EnumsMatching von DatenvariantenDas Option-Enum erneut betrachtetZusammenfassung – Shape-Enum6Definition von Traits
Was ist ein Trait?Traits implementierenStandardimplementierungenStandardimplementierungen überschreibenTraits mit ParameternZusammenfassung – Media PlayerÜbe selbstständig: Online-Rust-Compiler