Le paramètre Self
Fait partie de la section Programmation Orientée Objet du Journey Rust de Coddy. Leçon 2 sur 61.
Lorsqu’une méthode doit accéder aux données stockées dans une instance de struct, elle utilise le paramètre &self. Ce paramètre spécial est toujours le premier argument d’une méthode et représente une référence à l’instance sur laquelle la méthode est appelée.
Le symbole & signifie que nous empruntons l’instance plutôt que d’en prendre possession. Cela permet à la méthode de lire les champs de la structure sans consommer l’instance :
struct Rectangle {
width: u32,
height: u32,
}
impl Rectangle {
fn area(&self) -> u32 {
self.width * self.height
}
fn is_square(&self) -> bool {
self.width == self.height
}
}
Dans le corps de la méthode, self vous donne accès à tous les champs de la structure à l’aide de la notation par points. La méthode area lit à la fois width et height pour calculer et renvoyer le résultat.
Comme &self n’emprunte que l’instance, tu peux appeler plusieurs méthodes sur la même structure sans aucun problème :
fn main() {
let rect = Rectangle { width: 10, height: 5 };
println!("Area: {}", rect.area()); // 50
println!("Square? {}", rect.is_square()); // false
}
Les méthodes utilisant &self sont en lecture seule. Elles peuvent examiner les données de la structure, mais ne peuvent pas les modifier. Dans la prochaine leçon, tu apprendras à créer des méthodes capables de modifier l’instance.
Défi
FacileCréez une structure Circle avec un seul champ : radius (f64).
Ajoutez un bloc d’implémentation pour Circle avec deux méthodes qui utilisent &self :
circumference: renvoie la circonférence sous forme def64(formule :2.0 * 3.14159 * radius)diameter: renvoie le diamètre sous forme def64(formule :2.0 * radius)
Vous recevrez une entrée :
- Le rayon du cercle (f64)
Créez une instance de Circle avec le rayon fourni, puis affichez la circonférence et le diamètre sur des lignes distinctes.
Format de sortie attendu :
{circumference}
{diameter}Essayez vous-même
use std::io;
// TODO: Définis la structure Circle ici
// TODO: Ajoute le bloc d'implémentation pour Circle avec les méthodes circumference et diameter
fn main() {
let mut input = String::new();
io::stdin().read_line(&mut input).expect("Failed to read line");
let radius: f64 = input.trim().parse().expect("Invalid number");
// TODO: Crée une instance de Circle et affiche la circumference et le diameter
}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