La struct Screen
Fait partie de la section Object Oriented Programming du Journey Rust de Coddy. Leçon 52 sur 61.
Défi
FacileIl 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 traitDrawdes défis précédents.text_field.rs: Votre composantTextFieldqui afficheText: {content}.button.rs: Votre composantButtonqui afficheButton: {label} (width: {width}).screen.rs: Créez une structureScreenqui contient un champ publiccomponentsde typeVec<Box<dyn Draw>>. Implémentez une fonction associéenewqui crée un écran vide, et une méthodeaddqui prend unBox<dyn Draw>et l'ajoute au vecteur de composants.main.rs: Rassemblez tous les modules. Créez unScreen, ajoutez-y unTextFieldet unButton, puis itérez à travers les composants de l'écran et appelezdraw()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
1Méthodes et comportement
Introduction aux blocs d'implémentationLe paramètre SelfMéthodes mutablesFonctions associéesBlocs d'implémentation multiplesChaînage de méthodesRécapitulatif - Actions sur le rectangle4Projet : Animal virtuel
Définir l'animalNourrir l'animal7Traits standards
Le trait DebugLe trait DisplayClone et CopyLes traits d'égalitéRécapitulatif - Point affichable10Projet : Système de documents
Le trait DrawComposant texte2Encapsulation et modules
Bases des modulesLe mot-clé publicChamps privésGettersSettersRécapitulatif - Casier sécurisé5Généricité
Structures génériquesMéthodes génériquesPlusieurs types génériquesFonctions génériquesRécapitulatif - Point de coordonnées8Les Traits comme contraintes
Syntaxe des contraintes de traitContraintes multiplesLa clause whereRetourner des types avec des traitsRécapitulatif - Afficheur générique11Design Patterns en Rust
Le pattern NewtypeCompositionLe trait DropFrom et IntoRécapitulatif - Mock de Smart Pointer3Enums avancées
Enums avec donnéesMéthodes sur les EnumsMatching des variantes de donnéesL'Enum Option revisitéeRécapitulatif - Enum Shape6Définition des Traits
Qu'est-ce qu'un Trait ?Implémenter des TraitsImplémentations par défautRedéfinir les comportements par défautTraits avec paramètresRécapitulatif - Lecteur multimédiaEntraînez-vous par vous-même : Compilateur Rust en ligne