Méthodes mutables
Fait partie de la section Object Oriented Programming du Journey Rust de Coddy — leçon 3 sur 61.
Parfois, les méthodes doivent faire plus que simplement lire des données — elles doivent les modifier. Pour créer des méthodes capables de modifier les champs d'une structure, nous utilisons &mut self au lieu de &self.
Le mot-clé mut indique un emprunt mutable, donnant à la méthode la permission de modifier l'état interne de l'instance :
struct Counter {
value: i32,
}
impl Counter {
fn increment(&mut self) {
self.value += 1;
}
fn decrement(&mut self) {
self.value -= 1;
}
fn get(&self) -> i32 {
self.value
}
}
Notez que increment et decrement utilisent &mut self parce qu'ils modifient value, tandis que get utilise &self car il ne fait que lire les données.
Lors de l'appel de méthodes mutables, l'instance elle-même doit être déclarée comme mutable :
fn main() {
let mut counter = Counter { value: 0 };
counter.increment();
counter.increment();
println!("{}", counter.get()); // 2
counter.decrement();
println!("{}", counter.get()); // 1
}
Si vous oubliez le mot-clé mut lors de la création de l'instance, Rust vous empêchera d'appeler toute méthode &mut self sur celle-ci. Cela garantit que vous êtes toujours conscient du moment où vos données pourraient changer.
Défi
FacileCréez une structure BankAccount avec un seul champ : balance (i32).
Ajoutez un bloc d'implémentation pour BankAccount avec trois méthodes :
deposit— prend&mut selfet unamount: i32, ajoute le montant au soldewithdraw— prend&mut selfet unamount: i32, soustrait le montant du soldeget_balance— prend&selfet retourne le solde actuel en tant quei32
Vous recevrez trois entrées :
- Première ligne : le solde initial (i32)
- Deuxième ligne : le montant du dépôt (i32)
- Troisième ligne : le montant du retrait (i32)
Créez une instance mutable de BankAccount avec le solde initial, puis déposez le montant donné, retirez le montant donné et affichez le solde final.
Format de sortie attendu :
{final_balance}Aide-mémoire
Les méthodes qui modifient les champs d'une structure utilisent &mut self (emprunt mutable), tandis que les méthodes qui lisent uniquement les données utilisent &self :
struct Counter {
value: i32,
}
impl Counter {
fn increment(&mut self) {
self.value += 1;
}
fn decrement(&mut self) {
self.value -= 1;
}
fn get(&self) -> i32 {
self.value
}
}
Pour appeler des méthodes mutables, l'instance doit être déclarée comme mutable avec let mut :
let mut counter = Counter { value: 0 };
counter.increment();
counter.increment();
println!("{}", counter.get()); // 2
counter.decrement();
println!("{}", counter.get()); // 1
Sans le mot-clé mut sur l'instance, Rust empêchera l'appel de toute méthode &mut self.
Essayez vous-même
use std::io;
// TODO: Définir la structure BankAccount ici
// TODO: Ajouter le bloc d'implémentation pour BankAccount avec les méthodes deposit, withdraw, et get_balance
fn main() {
let mut input = String::new();
// Lire le solde initial
io::stdin().read_line(&mut input).expect("Failed to read line");
let initial_balance: i32 = input.trim().parse().expect("Invalid number");
input.clear();
// Lire le montant du dépôt
io::stdin().read_line(&mut input).expect("Failed to read line");
let deposit_amount: i32 = input.trim().parse().expect("Invalid number");
input.clear();
// Lire le montant du retrait
io::stdin().read_line(&mut input).expect("Failed to read line");
let withdraw_amount: i32 = input.trim().parse().expect("Invalid number");
// TODO: Créer une instance mutable de BankAccount avec initial_balance
// TODO: Appeler deposit avec deposit_amount
// TODO: Appeler withdraw avec withdraw_amount
// TODO: Afficher le solde final en utilisant get_balance
}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