Den Screen ausführen
Teil des Abschnitts Object Oriented Programming der Rust-Journey von Coddy — Lektion 53 von 61.
Aufgabe
EinfachHerzlichen 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: IhrDraw-Trait mit derdraw-Methode.text_field.rs: IhreTextField-Komponente, die"Text: {}"ausgibt.button.rs: IhreButton-Komponente, die"Button: {} (width: {})"ausgibt.screen.rs: IhreScreen-Struktur mit den Methodennewundadd. Fügen Sie einerun-Methode hinzu, die&selfentgegennimmt unddraw()für jede Komponente in der Sammlung aufruft.main.rs: Bringen Sie alles zusammen – erstellen Sie einenScreen, fügen Sie Ihre Komponenten hinzu und rufen Sierun()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
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