Il parametro self
Fa parte della sezione Programmazione orientata agli oggetti del percorso Rust di Coddy. Lezione 2 di 61.
Quando un metodo deve accedere ai dati archiviati in un'istanza di struct, usa il parametro &self. Questo parametro speciale è sempre il primo argomento di un metodo e rappresenta un riferimento all'istanza su cui viene chiamato il metodo.
Il simbolo & significa che stiamo prendendo in prestito l’istanza invece di assumerne la proprietà. Questo permette al metodo di leggere i campi della struct senza consumare l’istanza:
struct Rectangle {
width: u32,
height: u32,
}
impl Rectangle {
fn area(&self) -> u32 {
self.width * self.height
}
fn is_square(&self) -> bool {
self.width == self.height
}
}
All'interno del corpo del metodo, self ti consente di accedere a tutti i campi della struct usando la notazione con il punto. Il metodo area legge sia width sia height per calcolare e restituire il risultato.
Poiché &self prende in prestito solo l’istanza, puoi chiamare più metodi sulla stessa struct senza alcun problema:
fn main() {
let rect = Rectangle { width: 10, height: 5 };
println!("Area: {}", rect.area()); // 50
println!("Square? {}", rect.is_square()); // false
}
I metodi che usano &self sono di sola lettura. Possono esaminare i dati della struct, ma non possono modificarli. Nella prossima lezione imparerai a creare metodi che possono modificare l’istanza.
Sfida
FacileCrea una struct Circle con un solo campo: radius (f64).
Aggiungi un blocco di implementazione per Circle con due metodi che usano &self:
circumference: restituisce la circonferenza comef64(formula:2.0 * 3.14159 * radius)diameter: restituisce il diametro comef64(formula:2.0 * radius)
Riceverai un input:
- Il raggio del cerchio (f64)
Crea un'istanza di Circle con il raggio fornito, poi stampa la circonferenza e il diametro su righe separate.
Formato dell'output previsto:
{circumference}
{diameter}Provalo tu
use std::io;
// TODO: Definisci qui la struct Circle
// TODO: Aggiungi il blocco di implementazione per Circle con i metodi per la circonferenza e il diametro
fn main() {
let mut input = String::new();
io::stdin().read_line(&mut input).expect("Failed to read line");
let radius: f64 = input.trim().parse().expect("Invalid number");
// TODO: Crea un'istanza di Circle e stampa la circonferenza e il diametro
}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