Das Screen-Struct
Teil des Abschnitts Objektorientierte Programmierung der Rust-Journey von Coddy. Lektion 52 von 61.
Aufgabe
EinfachJetzt 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: DeinDraw-Trait aus den vorherigen Aufgaben.text_field.rs: DeineTextField-Komponente, dieText: {content}ausgibt.button.rs: DeineButton-Komponente, dieButton: {label} (width: {width})ausgibt.screen.rs: Erstelle eineScreen-Struktur, die ein öffentliches Feldcomponentsvom TypVec<Box<dyn Draw>>enthält. Implementiere eine zugehörige Funktionnew, die einen leeren Bildschirm erstellt, sowie eine Methodeadd, die einBox<dyn Draw>entgegennimmt und es zum Komponentenvektor hinzufügt.main.rs: Führe alle Module zusammen. Erstelle einenScreen, füge ihm einTextFieldund einenButtonhinzu, durchlaufe anschließend die Komponenten des Bildschirms und rufe für jede davondraw()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
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