In diversi linguaggi di programmazione possiamo indicare che una variabile potrebbe non avere nessun valore con la parola null. Tuttavia, dobbiamo creare molto più codice per gestire queste situazioni, perché spesso il programma potrebbe andare in crash. In Rust c’è un tipo di dati enumerativo che ci permette di gestire i dati facoltativi: Option.
Option supporta ogni tipo di dato. Quando viene eseguito il codice, il programma verifica se il tipo di dato ha il suo valore specifico oppure è vuoto. In caso di esito affermativo riceveremo Some(valore) e possiamo estrarre il valore con unwrap() o metodi più sicuri altrimenti è None. Possiamo usare match per gestire entrambe le situazioni.
Esempio di Option in Rust
Usiamo di nuovo l’esempio del punto usato per capire le strutture in Rust e aggiungiamo la coordinata z e le assegniamo come tipo Option<f64>. Stavolta aggiungiamo una funzione che crea il punto senza rendere pubbliche le variabili per questioni di sicurezza. Usiamo match per gestire i valori di z.
struct Point {
x: f64,
y: f64,
z: Option<f64>,
}
impl Point {
fn new(x: f64, y: f64, z: Option<f64>) -> Self {
Self { x, y, z }
}
fn print(&self) {
match self.z {
Some(z) => println!("{} {} {}", self.x, self.y, z),
None => println!("{} {}", self.x, self.y),
}
}
}
Nel metodo print stiamo dicendo al codice di guardare la proprietà z del punto:
- Se ha un valore (a cui abbiamo dato nome z in Some()), allora stampiamo sulla console le tre coordinate;
- Se non ha valore, allora stampiamo solo le coordinate x e y
In main possiamo fare delle prove:
fn main() {
let point = Point::new(29.0, 30.5, Some(10.0));
point.print(); //29 30.5 10
let point = Point::new(29.0, 30.5, None);
point.print(); //29 30.5
}