Menu
Coddy logo textTech

La struct Screen

Fa parte della sezione Programmazione orientata agli oggetti del percorso Rust di Coddy. Lezione 52 di 61.

challenge icon

Sfida

Facile

Ora è 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 trait Draw delle sfide precedenti.
  • text_field.rs: il tuo componente TextField che stampa Text: {content}.
  • button.rs: il tuo componente Button che stampa Button: {label} (width: {width}).
  • screen.rs: crea una struct Screen che contiene un campo pubblico components di tipo Vec<Box<dyn Draw>>. Implementa una funzione associata new che crea una schermata vuota e un metodo add che accetta un Box<dyn Draw> e lo aggiunge al vettore dei componenti.
  • main.rs: riunisci tutti i moduli. Crea una Screen, aggiungici un TextField e un Button, poi itera sui componenti della schermata e chiama draw() 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

Esercitati da solo: Compilatore Rust online