Vai al contenuto
eLearner.app
Modulo 4 · Lezione 2 di 28/14 nel corso~12 min
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:

Code
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 :::

Code
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):

Code
impl Rectangle {
    fn double_size(&mut self) {
        self.width *= 2;
        self.height *= 2;
    }
}

Prova tu

Esercizio#rust.m4.l2.e1
Tentativi: 0Caricamento…

Completa il blocco impl definendo il metodo area che prende &self e restituisce u32 (la moltiplicazione di width e height).

Caricamento editor…
Mostra suggerimento

Scrivi `fn area(&self) -> u32 { self.width \* self.height }`all'interno del blocco`impl Rectangle`.

Soluzione disponibile dopo 3 tentativi

Esercizio#rust.m4.l2.e2
Tentativi: 0Caricamento…

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.

Caricamento editor…
Mostra suggerimento

Scrivi `fn square(size: u32) -> Rectangle { Rectangle { width: size, height: size } }`all'interno del blocco`impl`.

Soluzione disponibile dopo 3 tentativi

Esercizio#rust.m4.l2.e3
Tentativi: 0Caricamento…

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.

Caricamento editor…
Mostra suggerimento

Implementa `fn scale(&mut self, factor: u32)`per aggiornare`self.width`e`self.height`moltiplicandoli per`factor`.

Soluzione disponibile dopo 3 tentativi