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édia