Lezioni del modulo (2/2)
Metodi e blocchi impl
In Rust, i metodi sono simili alle funzioni, ma sono definiti all'interno del contesto di una struct (o di un enum o trait) ed il loro primo parametro è sempre self, che rappresenta l'istanza della struct su cui il metodo viene chiamato.
Definire i Metodi con impl
Per definire i metodi su una struct, si usa un blocco impl (implementation) con il nome della struct:
struct Rectangle {
width: u32,
height: u32,
}
impl Rectangle {
// Questo è un metodo d'istanza. Prende &self in lettura.
fn area(&self) -> u32 {
self.width * self.height
}
}
fn main() {
let rect = Rectangle { width: 30, height: 50 };
// Chiamata al metodo tramite notazione con punto
println!("L'area è: {}", rect.area());
}
Funzioni Associate (Statiche)
Le funzioni definite in un blocco impl che non accettano self come primo parametro sono chiamate funzioni associate (equivalenti ai metodi statici in altri linguaggi).
Spesso vengono usate come costruttori per restituire nuove istanze della struct. Per chiamarle si usa la sintassi del doppio due punti :::
impl Rectangle {
// Funzione associata
fn square(size: u32) -> Rectangle {
Rectangle {
width: size,
height: size,
}
}
}
fn main() {
// Chiamata alla funzione associata
let sq = Rectangle::square(10);
}
Metodi che Modificano lo Stato: &mut self
Se un metodo necessita di modificare i campi della struct, deve dichiarare il primo parametro come &mut self. L'istanza stessa su cui viene chiamato il metodo deve essere dichiarata come mutabile (let mut):
impl Rectangle {
fn double_size(&mut self) {
self.width *= 2;
self.height *= 2;
}
}
Prova tu
Completa il blocco impl definendo il metodo area che prende &self e restituisce u32 (la moltiplicazione di width e height).
Mostra suggerimento
Scrivi `fn area(&self) -> u32 { self.width \* self.height }`all'interno del blocco`impl Rectangle`.
Soluzione disponibile dopo 3 tentativi
Definisci la funzione associata square all'interno di impl Rectangle, che riceve size: u32 e restituisce un'istanza Rectangle con larghezza ed altezza pari a size.
Mostra suggerimento
Scrivi `fn square(size: u32) -> Rectangle { Rectangle { width: size, height: size } }`all'interno del blocco`impl`.
Soluzione disponibile dopo 3 tentativi
Aggiungi il metodo mutatore scale a Rectangle all'interno del blocco impl. Il metodo scale deve prendere un riferimento mutabile a self (&mut self) e un parametro factor: u32, e moltiplicare sia width che height di Rectangle per factor.
Mostra suggerimento
Implementa `fn scale(&mut self, factor: u32)`per aggiornare`self.width`e`self.height`moltiplicandoli per`factor`.
Soluzione disponibile dopo 3 tentativi