Getters
Fait partie de la section Object Oriented Programming du Journey Rust de Coddy — leçon 11 sur 61.
Avec des champs privés, le code externe ne peut pas accéder directement aux données de votre struct. Mais parfois, vous devez laisser les autres lire les données sans leur donner la possibilité de les modifier. C'est là que les méthodes getter interviennent.
Un getter est simplement une méthode publique qui retourne une référence à un champ privé :
// wallet.rs
pub struct Wallet {
balance: f64,
}
impl Wallet {
pub fn new(initial: f64) -> Wallet {
Wallet { balance: initial }
}
pub fn balance(&self) -> f64 {
self.balance
}
}
La méthode balance() prend &self (accès en lecture seule) et renvoie la valeur du champ privé. En Rust, les getters sont généralement nommés d'après le champ lui-même — aucun préfixe get_ n'est nécessaire.
Désormais, le code externe peut lire le solde via la méthode :
// main.rs
mod wallet;
use wallet::Wallet;
fn main() {
let w = Wallet::new(100.0);
println!("Balance: {}", w.balance()); // Fonctionne !
}
Pour les champs contenant des données possédées comme String, vous retournerez souvent une référence pour éviter une copie inutile :
pub fn name(&self) -> &String {
&self.name
}
Les getters vous offrent un accès en lecture contrôlé tout en gardant le champ lui-même protégé. La struct reste responsable de ses données — le code externe peut consulter, mais ne peut pas modifier.
Défi
FacileConstruisons un système de profil utilisateur qui démontre comment les méthodes getter fournissent un accès en lecture contrôlé aux données privées.
Vous allez créer deux fichiers pour organiser votre code :
profile.rs: Définissez une structureUserProfileavec deux champs privés :username(String) etage(u32). La structure elle-même doit être publique, mais les champs doivent rester privés. Implémentez un constructeur publicnewqui prend un nom d'utilisateur et un âge. Ajoutez ensuite deux méthodes getter :username— retourne une référence au nom d'utilisateur (&String)age— retourne la valeur de l'âge (u32)
main.rs: Importez votre module de profil, créez unUserProfile, et utilisez les méthodes getter pour afficher les informations de l'utilisateur.
Rappelez-vous qu'en Rust, les getters sont généralement nommés d'après le champ lui-même — aucun préfixe get_ n'est nécessaire. Pour les champs String, retournez une référence pour éviter une copie inutile.
Votre sortie doit suivre exactement ce format :
Username: {username}
Age: {age}Par exemple, si vous créez un profil avec le nom d'utilisateur "alice" et l'âge 25, la sortie sera :
Username: alice
Age: 25Vous recevrez deux entrées : le nom d'utilisateur et l'âge.
Aide-mémoire
Une méthode getter est une méthode publique qui fournit un accès en lecture seule à un champ privé.
Les getters permettent au code externe de consulter les données sans pouvoir les modifier directement :
pub struct Wallet {
balance: f64,
}
impl Wallet {
pub fn new(initial: f64) -> Wallet {
Wallet { balance: initial }
}
pub fn balance(&self) -> f64 {
self.balance
}
}
En Rust, les getters portent le nom du champ lui-même — aucun préfixe get_ n'est nécessaire.
Pour les champs contenant des données possédées comme String, retournez une référence pour éviter une copie inutile :
pub fn name(&self) -> &String {
&self.name
}
Utilisation d'une méthode getter :
let w = Wallet::new(100.0);
println!("Balance: {}", w.balance());
Essayez vous-même
mod profile;
use profile::UserProfile;
fn main() {
let mut input1 = String::new();
std::io::stdin().read_line(&mut input1).expect("Failed to read line");
let username = input1.trim().to_string();
let mut input2 = String::new();
std::io::stdin().read_line(&mut input2).expect("Failed to read line");
let age: u32 = input2.trim().parse().expect("Failed to parse age");
// TODO: Créer un UserProfile en utilisant le constructeur
// TODO: Utiliser les méthodes getter pour afficher le nom d'utilisateur et l'âge
// Format :
// Username: {username}
// Age: {age}
}
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