Enumerazioni
Abbiamo visto come le strutture ci danno la possibilità di raggruppare dei valori correlati, come la componente x e y di un vettore.
Le enumerazioni ci danno invece la possibilità di esprimere che un valore può assumere solo un certo insieme di valori possibili.
Per esempio se vogliamo esprimere il fatto che un vettore può essere definito con le sue componenti cartesiane oppure con le coordinate polari, possiamo creare una nuova enumerazione CoordinateKind che può assumere solo due valori:
#![allow(unused)] fn main() { enum CoordinateKind { Cartesian, Polar } }
Possiamo adesso creare funzioni che accettano una CoordinateKind come argomento
#![allow(unused)] fn main() { enum CoordinateKind { Cartesian, Polar } fn do_something(kind: CoordinateKind) {} }
Possiamo adesso chiamare la funzione con una delle due varianti dell'enumerazione.
Il compilatore Rust verificherà che in ogni momento una variabile di tipo CoordinateKind contiene una delle varianti valide.
enum CoordinateKind { Cartesian, Polar } fn do_something(kind: CoordinateKind) {} fn main() { do_something(CoordinateKind::Cartesian); do_something(CoordinateKind::Polar); }
La vera potenza delle enumerazioni sta nel fatto che possiamo memorizzare informazioni per ognuna delle varianti. Intuitivamente è come se stessimo definendo più di una versione di una struttura.
enum Vector { Cartesian(f32, f32), Polar(f32, f32) } fn main() { let v1 = Vector::Cartesian(3.0, 2.0); let v2 = Vector::Polar(4.2, 1.0); }
In realtà le varianti possono includere diversi tipi di dati associati, ad esempio se vogliamo definire un tipo Request che rappresenta una richiesta con più tipi possibili, possiamo esprimerla così
#![allow(unused)] fn main() { enum Request { Exit, GetPage(String), GetValueAtPosition { x: u32, y: u32 }, SetBackgroundColor(u8, u8, u8) } }
Questa enumerazione ha quattro varianti:
Exitnon ha nessun dato associatogetPageha una stringa associatagetValueAtPositionha una struttura associata, con i nomi dei campisetBackgroundColorha una tupla associata, in questo caso tre valoriu8.