Menu
Coddy logo textTech

Funzioni associate

Fa parte della sezione Programmazione orientata agli oggetti del percorso Rust di Coddy. Lezione 4 di 61.

Non tutte le funzioni in un blocco impl devono operare su un’istanza esistente. Le funzioni che non prendono self come parametro sono chiamate funzioni associate: sono associate al tipo stesso anziché a una specifica istanza.

L'uso più comune delle funzioni associate è la creazione di costruttori. Per convenzione, spesso vengono chiamati new:

struct Player {
    name: String,
    score: u32,
}

impl Player {
    fn new(name: String) -> Player {
        Player {
            name,
            score: 0,
        }
    }
}

Nota che non c'è alcun parametro self. Questa funzione non ha bisogno di un Player esistente per funzionare. Invece, ne crea e restituisce uno nuovo di zecca. Il tipo restituito è la struct stessa.

Per chiamare una funzione associata, usa la sintassi :: con il nome del tipo invece della notazione con il punto:

fn main() {
    let player1 = Player::new(String::from("Alice"));
    
    println!("{} starts with {} points", player1.name, player1.score);
    // Output: Alice starts with 0 points
}

Questo schema offre un modo pulito per inizializzare le struct con valori predefiniti o una logica di convalida, mantenendo la logica di creazione insieme alla definizione del tipo. Probabilmente hai già visto questa sintassi con String::from(): anche questa è una funzione associata!

challenge icon

Sfida

Facile

Crea una struct Book con due campi: title (String) e pages (u32).

Aggiungi un blocco di implementazione per Book con una funzione associata chiamata new che:

  • Accetta un parametro title: String
  • Restituisce un nuovo Book con il titolo specificato e pages impostato a 0

Aggiungi anche un metodo chiamato info che accetta &self e restituisce una String nel formato: "{title} has {pages} pages"

Riceverai un input:

  • Il titolo del libro (String)

Usa la funzione associata Book::new per creare un libro con il titolo fornito, poi stampa il risultato della chiamata al metodo info.

Formato dell'output previsto:

{title} has {pages} pages

Provalo tu

use std::io;

// TODO: Definisci la struct Book con i campi title (String) e pages (u32)


// TODO: Aggiungi un blocco impl per Book con:
// - Una funzione associata `new` che accetta un titolo e restituisce un Book con pages impostato a 0
// - Un metodo `info` che restituisce una String nel formato "{title} has {pages} pages"


fn main() {
    let mut input = String::new();
    io::stdin().read_line(&mut input).expect("Failed to read line");
    let title = input.trim().to_string();

    // TODO: Usa Book::new per creare un libro con il titolo fornito
    // TODO: Stampa il risultato della chiamata al metodo info
}
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