Composant bouton
Fait partie de la section Object Oriented Programming du Journey Rust de Coddy — leçon 51 sur 61.
Défi
FacileContinuons à construire notre système de documents en ajoutant un deuxième composant d'interface utilisateur : un Button. Tout comme le TextField, ce composant implémentera le trait Draw, démontrant comment différents types peuvent partager une interface commune.
Vous allez étendre votre projet avec un autre fichier de module :
draw.rs: Conservez votre traitDrawdes défis précédents.text_field.rs: Conservez votre structureTextFieldet son implémentation deDraw.button.rs: Créez une structureButtonavec deux champs publics :label(unString) etwidth(unu32). Implémentez le traitDrawpourButtonde sorte que l'appel àdraw()affiche le bouton dans ce format :Button: {label} (width: {width})main.rs: Importez les trois modules. Créez à la fois unTextFieldet unButton, puis appelezdraw()sur chacun pour effectuer le rendu des deux composants.
Votre module button devra accéder au trait Draw en utilisant crate::draw::Draw, tout comme vous l'avez fait avec TextField.
Les entrées suivantes seront fournies :
- Première ligne : le contenu du champ de texte (text field)
- Deuxième ligne : le libellé (label) du bouton
- Troisième ligne : la largeur (width) du bouton (sous forme de nombre)
Votre sortie doit afficher le champ de texte en premier, puis le bouton, chacun sur sa propre ligne :
Text: Welcome
Button: Submit (width: 100)Essayez vous-même
mod draw;
mod text_field;
mod button;
use draw::Draw;
use text_field::TextField;
use button::Button;
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");
let text_field = TextField { content };
text_field.draw();
// TODO: Créer un Button avec `label` et `width`, puis appeler draw()
}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