Metodi mutabili
Fa parte della sezione Programmazione orientata agli oggetti del percorso Rust di Coddy. Lezione 3 di 61.
A volte i metodi devono fare più che limitarsi a leggere i dati. Devono modificarli. Per creare metodi che possono modificare i campi di una struct, usiamo &mut self invece di &self.
La parola chiave mut indica un prestito mutabile, dando al metodo il permesso di modificare lo stato interno dell'istanza:
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
}
}
Nota che increment e decrement usano &mut self perché modificano value, mentre get usa &self perché legge soltanto i dati.
Quando chiami metodi mutabili, l’istanza stessa deve essere dichiarata mutabile:
fn main() {
let mut counter = Counter { value: 0 };
counter.increment();
counter.increment();
println!("{}", counter.get()); // 2
counter.decrement();
println!("{}", counter.get()); // 1
}
Se dimentichi la parola chiave mut quando crei l’istanza, Rust ti impedirà di chiamare su di essa qualsiasi metodo &mut self. In questo modo ti assicuri di sapere sempre quando i tuoi dati potrebbero cambiare.
Sfida
FacileCrea una struct BankAccount con un singolo campo: balance (i32).
Aggiungi un blocco di implementazione per BankAccount con tre metodi:
deposit: riceve&mut selfe unamount: i32, aggiunge l'importo al saldowithdraw: riceve&mut selfe unamount: i32, sottrae l'importo dal saldoget_balance: riceve&selfe restituisce il saldo corrente comei32
Riceverai tre input:
- Prima riga: il saldo iniziale (i32)
- Seconda riga: l'importo del deposito (i32)
- Terza riga: l'importo del prelievo (i32)
Crea un'istanza mutabile di BankAccount con il saldo iniziale, quindi deposita l'importo indicato, preleva l'importo indicato e stampa il saldo finale.
Formato dell'output previsto:
{final_balance}Provalo tu
use std::io;
// TODO: Definisci qui la struct BankAccount
// TODO: Aggiungi il blocco di implementazione per BankAccount con i metodi deposit, withdraw e get_balance
fn main() {
let mut input = String::new();
// Leggi il saldo iniziale
io::stdin().read_line(&mut input).expect("Failed to read line");
let initial_balance: i32 = input.trim().parse().expect("Invalid number");
input.clear();
// Leggi l'importo del deposito
io::stdin().read_line(&mut input).expect("Failed to read line");
let deposit_amount: i32 = input.trim().parse().expect("Invalid number");
input.clear();
// Leggi l'importo del prelievo
io::stdin().read_line(&mut input).expect("Failed to read line");
let withdraw_amount: i32 = input.trim().parse().expect("Invalid number");
// TODO: Crea un'istanza mutabile di BankAccount con initial_balance
// TODO: Chiama deposit con deposit_amount
// TODO: Chiama withdraw con withdraw_amount
// TODO: Stampa il saldo finale usando get_balance
}Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Metodi e comportamento
Introduzione ai blocchi implIl parametro selfMetodi mutabiliFunzioni associateBlocchi impl multipliConcatenamento di metodiRiepilogo - Azioni sul rettangolo4Progetto: animale domestico virtuale
Definire l'animaleNutrire l'animale7Trait standard
Il trait DebugIl trait DisplayClone e CopyTrait di uguaglianzaRiepilogo - Punto stampabile10Progetto: sistema di documenti
Il trait DrawComponente di testo2Incapsulamento e moduli
Nozioni di base sui moduliLa parola chiave publicCampi privatiGetterSetterRiepilogo - Armadietto sicuro5Generics
Struct genericheMetodi genericiPiù tipi genericiFunzioni genericheRipasso - Punto di coordinate8I Trait come vincoli
Sintassi dei vincoli sui traitVincoli multipliLa clausola whereRestituire tipi con i traitRiepilogo - Stampante generica11Modelli di progettazione in Rust
Pattern NewtypeComposizioneIl trait DropFrom e IntoRipasso - Mock con smart pointer3Enumerazioni avanzate
Enumerazioni con datiMetodi sulle enumerazioniCorrispondenza delle varianti con datiL'enumerazione Option ripresaRiepilogo - enumerazione Shape6Definizione dei trait
Che cos’è un trait?Implementare i traitImplementazioni predefiniteSovrascrivere le implementazioni predefiniteTrait con parametriRiepilogo - Lettore multimedialeEsercitati da solo: Compilatore Rust online