Introduzione ai blocchi impl
Fa parte della sezione Programmazione orientata agli oggetti del percorso Rust di Coddy. Lezione 1 di 61.
In Rust, le struct definiscono quali dati contiene un tipo, ma non definiscono cosa può fare quel tipo. Per assegnare un comportamento a una struct, usiamo i blocchi di implementazione con la parola chiave impl.
Un blocco di implementazione collega le funzioni (chiamate metodi) a una struct specifica. Ecco la struttura di base:
struct Dog {
name: String,
age: u8,
}
impl Dog {
fn bark(&self) {
println!("{} says woof!", self.name);
}
}
Il blocco impl Dog dice a Rust che tutto ciò che contiene appartiene alla struct Dog. Questa separazione mantiene pulita la definizione dei dati e ti consente di aggiungere tutti i metodi necessari nel blocco di implementazione.
Per chiamare un metodo, usa la notazione con il punto su un'istanza:
fn main() {
let my_dog = Dog {
name: String::from("Rex"),
age: 3,
};
my_dog.bark(); // Output: Rex says woof!
}
Questo schema che separa i dati (la struct) dal comportamento (il blocco impl) è fondamentale per organizzare il codice Rust. Nelle prossime lezioni esploreremo come i metodi accedono ai dati delle struct tramite il parametro &self che vedi nell'esempio qui sopra.
Sfida
FacileCrea una struct Cat con due campi: name (String) e lives (u8).
Aggiungi un blocco di implementazione per Cat con un metodo chiamato meow che accetta &self e stampa il nome del gatto seguito da " says meow!".
Riceverai due input:
- Prima riga: il nome del gatto (String)
- Seconda riga: il numero di vite (u8)
Crea un'istanza di Cat con i valori forniti e chiamane il metodo meow.
Formato dell'output previsto:
{name} says meow!Provalo tu
use std::io;
// TODO: Definisci la struct Cat con i campi 'name' (String) e 'lives' (u8)
// TODO: Aggiungi un blocco di implementazione per Cat con un metodo 'meow'
fn main() {
let mut name = String::new();
io::stdin().read_line(&mut name).expect("Failed to read line");
let name = name.trim().to_string();
let mut lives_input = String::new();
io::stdin().read_line(&mut lives_input).expect("Failed to read line");
let lives: u8 = lives_input.trim().parse().expect("Failed to parse lives");
// TODO: Crea un'istanza di Cat e chiama il metodo meow
}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