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

Entraînez-vous par vous-même : Compilateur Rust en ligne