Qu'est-ce qu'un Trait ?
Fait partie de la section Programmation Orientée Objet du Journey Rust de Coddy. Leçon 29 sur 61.
Les génériques vous permettent d’écrire du code qui fonctionne avec n’importe quel type, mais vous devez parfois garantir qu’un type peut faire quelque chose de précis. C’est là qu’interviennent les traits.
Un trait définit un ensemble de méthodes qu’un type doit implémenter. Considère-le comme un contrat : tout type qui « signe » ce contrat promet de fournir le comportement spécifié. Si tu as utilisé des interfaces dans d’autres langages, les traits servent à un objectif similaire.
Voici comment vous définissez un trait :
trait Describable {
fn describe(&self) -> String;
}
Le mot-clé trait introduit le trait, suivi de son nom. À l’intérieur des accolades, vous déclarez les signatures de méthode : uniquement le nom, les paramètres et le type de retour, sans corps. Le point-virgule après la signature indique qu’il s’agit d’une exigence, et non d’une implémentation.
Ce trait Describable indique : « Tout type qui m’implémente doit fournir une méthode describe qui prend une référence vers lui-même et renvoie une String. » Le trait ne se soucie pas de la manière dont la méthode fonctionne : cela dépend de chaque type qui l’implémente.
Les traits deviennent puissants lorsque plusieurs types différents implémentent le même trait. Un Book, une Car et une Person pourraient tous être Describable, chacun fournissant sa propre description unique. Le trait garantit qu’ils partagent tous cette capacité commune.
Défi
FacileDéfinissons votre premier trait ! Un trait établit un contrat : la promesse que tout type qui l’implémente fournira un comportement spécifique. Vous allez créer un trait Summarizable que différents types pourront implémenter afin de fournir un résumé d’eux-mêmes.
Vous allez organiser votre code sur deux fichiers :
summary.rs: définissez un trait public appeléSummarizableavec une seule signature de méthode :summarize(&self) -> String. Souvenez-vous que, dans une définition de trait, vous déclarez uniquement la signature de la méthode avec un point-virgule : aucun corps. Cela indique à Rust que « tout type qui implémente ce trait doit fournir une méthodesummarizequi renvoie uneString. »main.rs: importez votre module de résumé et affichez un message confirmant que votre trait est défini. Comme nous n’avons pas encore appris à implémenter des traits (c’est la prochaine leçon !), vous vérifierez simplement que votre trait se compile correctement.
Dans votre fichier principal, affichez le message suivant pour confirmer que votre définition de trait est valide :
Summarizable trait defined successfully!Ce défi se concentre uniquement sur la syntaxe de définition d’un trait : le mot-clé trait, le nom du trait et la déclaration de signatures de méthodes sans implémentations. Dans la prochaine leçon, vous apprendrez à faire implémenter ce trait par des structures !
Essayez vous-même
mod summary;
fn main() {
// TODO: Affiche le message de confirmation indiquant que le trait est défini
// Expected output: "Summarizable trait defined successfully!"
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation Orientée Objet
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