Blocchi impl multipli
Fa parte della sezione Programmazione orientata agli oggetti del percorso Rust di Coddy. Lezione 5 di 61.
Rust ti consente di suddividere i metodi di una struct in più blocchi impl. Anche se potresti inserire tutto in un unico blocco, separarli può rendere il tuo codice più organizzato e leggibile.
Ecco una struct con le sue funzionalità suddivise in due blocchi di implementazione:
struct BankAccount {
balance: f64,
}
// Costruttore e operazioni di base
impl BankAccount {
fn new(initial: f64) -> BankAccount {
BankAccount { balance: initial }
}
fn balance(&self) -> f64 {
self.balance
}
}
// Metodi per le transazioni
impl BankAccount {
fn deposit(&mut self, amount: f64) {
self.balance += amount;
}
fn withdraw(&mut self, amount: f64) {
self.balance -= amount;
}
}
Entrambi i blocchi funzionano insieme senza problemi: Rust li tratta come se fossero uno solo. Puoi chiamare qualsiasi metodo, indipendentemente dal blocco in cui è definito:
fn main() {
let mut account = BankAccount::new(100.0);
account.deposit(50.0);
println!("{}", account.balance()); // 150
}
Questo schema diventa particolarmente utile man mano che le tue struct crescono. Potresti raggruppare i costruttori, tenere separati i metodi di sola lettura da quelli che modificano i dati oppure organizzare tutto in base alle funzionalità. Non c’è limite al numero di blocchi impl che una struct può avere.
Sfida
FacileCrea una struct Player con due campi: name (String) e score (u32).
Organizza i metodi della struct in due blocchi di implementazione separati:
Primo blocco impl: costruttore e query:
new: una funzione associata che accetta unname: Stringe restituisce unPlayerconscoreimpostato a0get_score: accetta&selfe restituisce il punteggio corrente comeu32
Secondo blocco impl: modifiche al punteggio:
add_points: accetta&mut selfepoints: u32, aggiunge i punti al punteggioreset_score: accetta&mut selfe riporta il punteggio a0
Riceverai tre input:
- Prima riga: il nome del giocatore (String)
- Seconda riga: i punti da aggiungere nel primo round (u32)
- Terza riga: i punti da aggiungere nel secondo round (u32)
Crea un giocatore usando Player::new, aggiungi i punti del primo round, stampa il punteggio, poi azzera il punteggio, aggiungi i punti del secondo round e stampa il punteggio finale.
Formato dell'output previsto:
{score_after_first_round}
{score_after_reset_and_second_round}Provalo tu
use std::io;
// TODO: Definisci la struct Player con i campi name (String) e score (u32)
// TODO: Primo blocco impl - Costruttore e metodi di consultazione (new, get_score)
// TODO: Secondo blocco impl - Metodi per modificare il punteggio (add_points, reset_score)
fn main() {
let mut input = String::new();
// Leggi il nome del giocatore
io::stdin().read_line(&mut input).expect("Failed to read line");
let name = input.trim().to_string();
// Leggi i punti del primo turno
input.clear();
io::stdin().read_line(&mut input).expect("Failed to read line");
let first_round: u32 = input.trim().parse().expect("Invalid number");
// Leggi i punti del secondo turno
input.clear();
io::stdin().read_line(&mut input).expect("Failed to read line");
let second_round: u32 = input.trim().parse().expect("Invalid number");
// TODO: Crea un giocatore usando Player::new
// TODO: Aggiungi i punti del primo turno e stampa il punteggio
// TODO: Azzera il punteggio
// TODO: Aggiungi i punti del secondo turno e stampa il punteggio finale
}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