Le paramètre Self
Fait partie de la section Object Oriented Programming 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 la propriété. 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
}
}
À l'intérieur du corps de la méthode, self vous donne accès à tous les champs de la structure en utilisant la notation par point. La méthode area lit à la fois width et height pour calculer et renvoyer le résultat.
Parce que &self emprunte seulement l'instance, vous pouvez 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()); // faux
}
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, vous apprendrez comment créer des méthodes qui peuvent modifier l'instance.
Défi
FacileCréez une struct Circle avec un seul champ : radius (f64).
Ajoutez un bloc d'implémentation pour Circle avec deux méthodes qui utilisent &self :
circumference— retourne la circonférence en tant quef64(formule :2.0 * 3.14159 * radius)diameter— retourne le diamètre en tant quef64(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 séparées.
Format de sortie attendu :
{circumference}
{diameter}Aide-mémoire
Les méthodes accèdent aux données de la structure en utilisant le paramètre &self, qui doit être le premier argument. Le symbole & signifie que la méthode emprunte l'instance plutôt que d'en prendre la propriété :
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
}
}
À l'intérieur de la méthode, utilisez self avec la notation par point pour accéder aux champs de la structure. Les méthodes avec &self sont en lecture seule et peuvent examiner les données mais pas les modifier.
Comme &self ne fait qu'emprunter l'instance, vous pouvez appeler plusieurs méthodes sur la même structure :
let rect = Rectangle { width: 10, height: 5 };
println!("Area: {}", rect.area()); // 50
println!("Square? {}", rect.is_square()); // false
Essayez vous-même
use std::io;
// TODO: Définir la structure Circle ici
// TODO: Ajouter 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éer une instance de Circle et afficher la circonférence et le diamètre
}Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
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