La struct Screen
Fa parte della sezione Programmazione orientata agli oggetti del percorso Rust di Coddy. Lezione 52 di 61.
Sfida
FacileOra è il momento di riunire tutti i tuoi componenti dell’interfaccia utente! Creerai una struct Screen in grado di contenere una raccolta di componenti disegnabili diversi usando oggetti trait. È qui che la potenza di Vec<Box<dyn Draw>> dà il meglio di sé: una raccolta che gestisce più tipi di componenti.
Aggiungerai un nuovo modulo al tuo progetto in crescita:
draw.rs: il tuo traitDrawdelle sfide precedenti.text_field.rs: il tuo componenteTextFieldche stampaText: {content}.button.rs: il tuo componenteButtonche stampaButton: {label} (width: {width}).screen.rs: crea una structScreenche contiene un campo pubblicocomponentsdi tipoVec<Box<dyn Draw>>. Implementa una funzione associatanewche crea una schermata vuota e un metodoaddche accetta unBox<dyn Draw>e lo aggiunge al vettore dei componenti.main.rs: riunisci tutti i moduli. Crea unaScreen, aggiungici unTextFielde unButton, poi itera sui componenti della schermata e chiamadraw()su ciascuno.
La tua Screen deve memorizzare oggetti trait, quindi userai la parola chiave dyn con il tuo trait Draw. Il metodo add dovrebbe accettare &mut self, dato che modifica il vettore dei componenti.
Verranno forniti i seguenti input:
- Prima riga: il contenuto del campo di testo
- Seconda riga: l’etichetta del pulsante
- Terza riga: la larghezza del pulsante (come numero)
L’output dovrebbe mostrare ogni componente su una riga separata, nell’ordine in cui sono stati aggiunti:
Text: Hello
Button: Click Me (width: 80)Provalo tu
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: Crea uno Screen usando Screen::new()
// TODO: Aggiungi allo screen un TextField racchiuso in Box::new()
// TODO: Aggiungi allo screen un Button racchiuso in Box::new()
// TODO: Itera su screen.components e chiama draw() su ogni componente
}Tutte le lezioni di Programmazione orientata agli oggetti
1Metodi e comportamento
Introduzione ai blocchi implIl parametro selfMetodi mutabiliFunzioni associateBlocchi impl multipliConcatenamento di metodiRiepilogo - Azioni sul rettangolo4Progetto: animale domestico virtuale
Definire l'animaleNutrire l'animale7Trait standard
Il trait DebugIl trait DisplayClone e CopyTrait di uguaglianzaRiepilogo - Punto stampabile10Progetto: sistema di documenti
Il trait DrawComponente di testo2Incapsulamento e moduli
Nozioni di base sui moduliLa parola chiave publicCampi privatiGetterSetterRiepilogo - Armadietto sicuro5Generics
Struct genericheMetodi genericiPiù tipi genericiFunzioni genericheRipasso - Punto di coordinate8I Trait come vincoli
Sintassi dei vincoli sui traitVincoli multipliLa clausola whereRestituire tipi con i traitRiepilogo - Stampante generica11Modelli di progettazione in Rust
Pattern NewtypeComposizioneIl trait DropFrom e IntoRipasso - Mock con smart pointer3Enumerazioni avanzate
Enumerazioni con datiMetodi sulle enumerazioniCorrispondenza delle varianti con datiL'enumerazione Option ripresaRiepilogo - enumerazione Shape6Definizione dei trait
Che cos’è un trait?Implementare i traitImplementazioni predefiniteSovrascrivere le implementazioni predefiniteTrait con parametriRiepilogo - Lettore multimedialeEsercitati da solo: Compilatore Rust online