Lecciones del módulo (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).
Mostrar pista
Scrivi `fn area(&self) -> u32 { self.width \* self.height }`all'interno del blocco`impl Rectangle`.
Solución disponible después de 3 intentos
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.
Mostrar pista
Scrivi `fn square(size: u32) -> Rectangle { Rectangle { width: size, height: size } }`all'interno del blocco`impl`.
Solución disponible después de 3 intentos
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.
Mostrar pista
Implementa `fn scale(&mut self, factor: u32)`per aggiornare`self.width`e`self.height`moltiplicandoli per`factor`.
Solución disponible después de 3 intentos