Che cos’è un trait?
Fa parte della sezione Programmazione orientata agli oggetti del percorso Rust di Coddy. Lezione 29 di 61.
I generics ti permettono di scrivere codice che funziona con qualsiasi tipo, ma a volte devi garantire che un tipo possa fare qualcosa di specifico. È qui che entrano in gioco i trait.
Un trait definisce un insieme di metodi che un tipo deve implementare. Pensalo come un contratto: qualsiasi tipo che "firma" questo contratto si impegna a fornire il comportamento specificato. Se hai usato interfacce in altri linguaggi, i trait svolgono uno scopo simile.
Ecco come definisci un trait:
trait Describable {
fn describe(&self) -> String;
}
La parola chiave trait introduce il trait, seguito dal suo nome. All'interno delle parentesi graffe, dichiari le firme dei metodi: solo il nome, i parametri e il tipo restituito, senza corpo. Il punto e virgola dopo la firma indica che si tratta di un requisito, non di un'implementazione.
Questo tratto Describable afferma: «Qualsiasi tipo che implementa questo tratto deve fornire un metodo describe che prende un riferimento a se stesso e restituisce una String.» Al tratto non importa come funziona il metodo: spetta a ciascun tipo che lo implementa deciderlo.
I trait diventano potenti quando più tipi diversi implementano lo stesso trait. Un Book, un Car e una Person potrebbero essere tutti Describable, ciascuno fornendo una propria descrizione unica. Il trait garantisce che condividano tutti questa capacità comune.
Sfida
FacileDefiniamo il tuo primo trait! Un trait stabilisce un contratto: una promessa che qualsiasi tipo lo implementi fornirà un comportamento specifico. Creerai un trait Summarizable che diversi tipi possono implementare per fornire un riepilogo di sé.
Organizzerai il tuo codice in due file:
summary.rs: Definisci un trait pubblico chiamatoSummarizablecon un'unica firma di metodo:summarize(&self) -> String. Ricorda: nella definizione di un trait dichiari solo la firma del metodo, con un punto e virgola: senza corpo. Questo comunica a Rust: "qualsiasi tipo che implementa questo trait deve fornire un metodosummarizeche restituisce unaString."main.rs: Includi il tuo modulo summary e stampa un messaggio che confermi che il trait è definito. Poiché non abbiamo ancora imparato a implementare i trait (sarà la prossima lezione!), verificherai semplicemente che il tuo trait venga compilato correttamente.
Nel tuo file principale, stampa il seguente messaggio per confermare che la definizione del trait è valida:
Summarizable trait defined successfully!Questa sfida si concentra esclusivamente sulla sintassi di definizione dei trait: la parola chiave trait, il nome del trait e la dichiarazione delle firme dei metodi senza implementazioni. Nella prossima lezione, imparerai a fare in modo che le struct implementino questo trait!
Provalo tu
mod summary;
fn main() {
// TODO: stampa il messaggio di conferma che il trait è definito
// Output previsto: "Summarizable trait defined successfully!"
}
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