Menu
Coddy logo textTech

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.

challenge icon

Sfida

Facile

Crea 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 come f64 (formula: 2.0 * 3.14159 * radius)
  • diameter: restituisce il diametro come f64 (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
    
}
quiz iconMettiti alla prova

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

Esercitati da solo: Compilatore Rust online