Récapitulatif - Mock de Smart Pointer
Fait partie de la section Programmation Orientée Objet du Journey Rust de Coddy. Leçon 58 sur 61.
Défi
FacileConstruisons un simulacre de pointeur intelligent appelé SmartBox qui montre comment fonctionnent réellement les pointeurs intelligents de Rust en interne ! Votre enveloppe sera générique, donnera accès à sa valeur interne et annoncera automatiquement quand elle est nettoyée.
Vous organiserez votre code sur deux fichiers :
smart_box.rs: Définissez une structure générique publiqueSmartBox<T>avec un seul champvaluede typeT. Implémentez une fonction associéenewqui crée une SmartBox et affiche un message de création. Ajoutez une méthodegetqui renvoie une référence vers la valeur interne. Enfin, implémentez le traitDroppour afficher un message de nettoyage lorsque la SmartBox sort de sa portée.main.rs: Incluez votre module smart_box et montrez votre SmartBox avec deux types différents. Créez uneSmartBox<i32>contenant un nombre et uneSmartBox<String>contenant du texte (tous deux provenant des entrées fournies). Affichez les valeurs à l’aide de votre méthodeget. Les messages de Drop apparaîtront automatiquement lorsque les boîtes sortiront de leur portée à la fin de main.
Lorsqu’une SmartBox est créée, elle doit afficher :
SmartBox createdLors de l’accès à la valeur, affichez-la dans ce format :
Value: {value}Lorsqu’une SmartBox est supprimée, elle doit afficher :
SmartBox droppedPar exemple, avec les entrées 42 et Hello :
SmartBox created
SmartBox created
Value: 42
Value: Hello
SmartBox dropped
SmartBox droppedRemarquez que les deux boîtes sont d’abord créées, puis que leurs valeurs sont consultées, et qu’enfin elles sont toutes deux supprimées dans l’ordre inverse (la dernière créée est la première supprimée) lorsque main se termine.
Vous recevrez deux entrées : une valeur entière (à analyser comme i32) et une valeur chaîne.
Essayez vous-même
mod smart_box;
use smart_box::SmartBox;
fn main() {
// Lire les entrées
let mut input1 = String::new();
std::io::stdin().read_line(&mut input1).expect("Failed to read line");
let number: i32 = input1.trim().parse().expect("Failed to parse number");
let mut input2 = String::new();
std::io::stdin().read_line(&mut input2).expect("Failed to read line");
let text = input2.trim().to_string();
// TODO: Créer une SmartBox<i32> contenant le nombre
// TODO: Créer une SmartBox<String> contenant le texte
// TODO: Afficher les valeurs en utilisant la méthode get
// Format : "Value: {value}"
// Les messages Drop apparaîtront automatiquement quand main se termine
}
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