Menu
Coddy logo textTech

La struct Screen

Fait partie de la section Object Oriented Programming du Journey Rust de Coddy — leçon 52 sur 61.

challenge icon

Défi

Facile

Il est maintenant temps de rassembler tous vos composants d'interface utilisateur ! Vous allez créer une structure Screen capable de contenir une collection de différents composants dessinables en utilisant des objets de trait. C'est ici que la puissance de Vec<Box<dyn Draw>> brille vraiment : une seule collection qui gère plusieurs types de composants.

Vous allez ajouter un nouveau module à votre projet en pleine croissance :

  • draw.rs : Votre trait Draw des défis précédents.
  • text_field.rs : Votre composant TextField qui affiche Text: {content}.
  • button.rs : Votre composant Button qui affiche Button: {label} (width: {width}).
  • screen.rs : Créez une structure Screen qui contient un champ public components de type Vec<Box<dyn Draw>>. Implémentez une fonction associée new qui crée un écran vide, et une méthode add qui prend un Box<dyn Draw> et l'ajoute au vecteur de composants.
  • main.rs : Rassemblez tous les modules. Créez un Screen, ajoutez-y un TextField et un Button, puis itérez à travers les composants de l'écran et appelez draw() sur chacun d'eux.

Votre Screen doit stocker des objets de trait, vous utiliserez donc le mot-clé dyn avec votre trait Draw. La méthode add doit prendre &mut self puisqu'elle modifie le vecteur de composants.

Les entrées suivantes seront fournies :

  • Première ligne : le contenu du champ de texte
  • Deuxième ligne : le libellé du bouton
  • Troisième ligne : la largeur du bouton (sous forme de nombre)

Votre sortie doit afficher chaque composant sur sa propre ligne, dans l'ordre où ils ont été ajoutés :

Text: Hello
Button: Click Me (width: 80)

Essayez vous-même

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: Créer un Screen en utilisant Screen::new()
    // TODO: Ajouter un TextField enveloppé dans Box::new() à l'écran
    // TODO: Ajouter un Button enveloppé dans Box::new() à l'écran
    // TODO: Itérer sur screen.components et appeler draw() sur chaque composant
}

Toutes les leçons de Object Oriented Programming