Struct ed enum generici
Costruisca tipi di dati flessibili.
Struct ed enum generici è una lezione Learn Rust Coding gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Learn Rust Coding, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Learn Rust Coding include 4 lezioni in totale.
Strutture dati generiche
Come le funzioni, anche struct ed enum possono essere generici rispetto a uno o più tipi. In questo modo una singola definizione può contenere valori di qualsiasi tipo.
La libreria standard è costruita in questo modo: Vec<T>, Option<T> e Result<T, E> sono tutti generici.
Una struct generica
Dichiari il parametro di tipo dopo il nome della struct, quindi lo usi per i campi. Qui Point memorizza due valori dello stesso tipo T.
Una sola definizione può ora rappresentare punti con coordinate intere, in virgola mobile e di altri tipi.
struct Point<T> {
x: T,
y: T,
}Costruzione di struct generiche
Quando crea un'istanza, il compilatore deduce T dai valori dei campi. Entrambi i campi devono avere lo stesso tipo.
Questo programma costruisce un punto intero e un punto in virgola mobile usando la stessa struct.
struct Point<T> {
x: T,
y: T,
}
fn main() {
let a = Point { x: 1, y: 2 };
let b = Point { x: 1.5, y: 4.0 };
println!("{} {}", a.x, b.y);
}Parametri di tipo misti
L'uso di due parametri permette ai campi di avere tipi diversi. Pair<T, U> può contenere contemporaneamente un intero e una stringa.
Scelga un solo parametro quando i campi devono avere lo stesso tipo e più parametri quando possono differire.
struct Pair<T, U> {
first: T,
second: U,
}Metodi su struct generiche
Per aggiungere metodi, ripeta il parametro di tipo nel blocco impl: impl<T> Point<T>. Il parametro dopo impl lo dichiara; quello dopo il nome del tipo lo applica.
Qui un getter restituisce un riferimento al campo x.
struct Point<T> {
x: T,
y: T,
}
impl<T> Point<T> {
fn x(&self) -> &T {
&self.x
}
}Metodi con vincoli
Può scrivere metodi solo per determinati tipi concreti o per tipi che soddisfano un vincolo. Questo impl si applica esclusivamente a Point<f64>.
Di conseguenza, dist_from_origin esiste per i punti in virgola mobile, ma non per quelli interi.
struct Point<T> { x: T, y: T }
impl Point<f64> {
fn dist_from_origin(&self) -> f64 {
(self.x * self.x + self.y * self.y).sqrt()
}
}Un enum generico
Anche gli enum possono essere generici. Ogni variante può contenere dati generici. Questo rispecchia l'Option standard, che può essere Some(T) oppure None.
Definirne uno proprio aiuta a capire come funziona il tipo della libreria.
enum Maybe<T> {
Just(T),
Nothing,
}Due parametri in un enum
Result usa due parametri, così i valori di successo e di errore possono essere diversi. Ecco una versione semplificata.
Più parametri di tipo negli enum consentono una gestione flessibile degli errori in tutto l'ecosistema.
enum Either<L, R> {
Left(L),
Right(R),
}Pattern matching su enum generici
Applica il pattern matching agli enum generici esattamente come a quelli concreti. Il payload vincolato diventa un binding all'interno del braccio.
Questo programma estrae il valore da un Maybe personalizzato e stampa il valore contenuto oppure un valore alternativo.
enum Maybe<T> { Just(T), Nothing }
fn main() {
let m: Maybe<i32> = Maybe::Just(5);
match m {
Maybe::Just(n) => println!("got {}", n),
Maybe::Nothing => println!("empty"),
}
}Avvolgimento di un valore
Un pattern comune è una struct wrapper con un campo di tipo T e alcuni metodi di supporto. Qui Wrapper memorizza e restituisce qualsiasi valore.
Questa è la base dei pattern newtype e dei tipi simili agli smart pointer.
struct Wrapper<T> { inner: T }
impl<T> Wrapper<T> {
fn new(v: T) -> Self {
Wrapper { inner: v }
}
}
fn main() {
let w = Wrapper::new("hi");
println!("{}", w.inner);
}Nessun overhead a runtime
Anche le struct e gli enum generici vengono monomorfizzati. Dopo la compilazione, Point<i32> e Point<f64> diventano due tipi distinti e completamente specializzati.
Non esistono indirezioni nascoste né tag per il tipo generico in sé.
Verifica rapida
Verifichi la sua comprensione delle struct e degli enum generici.
Riepilogo
Le struct e gli enum dichiarano i parametri di tipo dopo il nome e li usano nei campi e nelle varianti, consentendo contenitori riutilizzabili come Option e Result.
I metodi ripetono i parametri in impl<T> e può scrivere blocchi impl specializzati per tipi concreti. Tutto viene monomorfizzato, senza overhead.
Domande Frequenti
La lezione «Struct ed enum generici» è gratuita?
Sì — il testo completo di «Struct ed enum generici» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Learn Rust Coding, passa a CoddyKit PRO. Il corso Learn Rust Coding include 4 lezioni in totale.
Cosa imparerò in «Struct ed enum generici»?
Costruisca tipi di dati flessibili. Eserciti Learn Rust Coding con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Learn Rust Coding?
Non è richiesta alcuna esperienza precedente. Learn Rust Coding su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.
Quanto tempo richiede la lezione «Struct ed enum generici»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Learn Rust Coding?
Sì. Ogni lezione Learn Rust Coding include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Funzioni generiche
- Struct ed enum generici
- Vincoli dei trait
- Clausole where e vincoli multipli