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!
Sfida
FacileCrea 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
Bookcon il titolo specificato epagesimpostato a0
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} pagesProvalo 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
}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
1Metodi e comportamento
Introduzione ai blocchi implIl parametro selfMetodi mutabiliFunzioni associateBlocchi impl multipliConcatenamento di metodiRiepilogo - Azioni sul rettangolo4Progetto: animale domestico virtuale
Definire l'animaleNutrire l'animale7Trait standard
Il trait DebugIl trait DisplayClone e CopyTrait di uguaglianzaRiepilogo - Punto stampabile10Progetto: sistema di documenti
Il trait DrawComponente di testo2Incapsulamento e moduli
Nozioni di base sui moduliLa parola chiave publicCampi privatiGetterSetterRiepilogo - Armadietto sicuro5Generics
Struct genericheMetodi genericiPiù tipi genericiFunzioni genericheRipasso - Punto di coordinate8I Trait come vincoli
Sintassi dei vincoli sui traitVincoli multipliLa clausola whereRestituire tipi con i traitRiepilogo - Stampante generica11Modelli di progettazione in Rust
Pattern NewtypeComposizioneIl trait DropFrom e IntoRipasso - Mock con smart pointer3Enumerazioni avanzate
Enumerazioni con datiMetodi sulle enumerazioniCorrispondenza delle varianti con datiL'enumerazione Option ripresaRiepilogo - enumerazione Shape6Definizione dei trait
Che cos’è un trait?Implementare i traitImplementazioni predefiniteSovrascrivere le implementazioni predefiniteTrait con parametriRiepilogo - Lettore multimedialeEsercitati da solo: Compilatore Rust online