La versione di Rust dell'istruzione if
non è particolarmente complessa,
ma somiglia più all'if
che si trova nei linguaggi tipizzati dinamicamente
che a quello dei linguaggi di sistema traditionali.
Perciò parliamone, per assicurarsi che ne siano afferrate le sfumature.
if
è una forma specifica di un concetto più generale, la ‘diramazione’,
il cui nome deriva dai rami degli alberi: è un punto di decisione, dove
a seconda di un valore, si possono prendere più strade.
Nel caso dell'if
, c'è un valore booleano che conduce a due strade:
let x = 5; if x == 5 { println!("x vale cinque!"); }
Se cambiamo il valore di x
a qualcos'altro, questa riga non verrebbe
stampata. Più specificamente, se l'espressione dopo l'if
vale true
, allora
il blocco viene eseguito; se vale false
, no.
Se si vuole che accada qualcosa caso false
, si usa una clausola else
:
let x = 5; if x == 5 { println!("x vale cinque!"); } else { println!("x non vale cinque :("); }
If c'è più di un caso, si usa un else if
:
let x = 5; if x == 5 { println!("x vale cinque!"); } else if x == 6 { println!("x vale sei!"); } else { println!("x non vale né cinque né sei :("); }
Tutto ciò è abbastanza normale. Però, si può fare anche questo:
fn main() { let x = 5; let y = if x == 5 { 10 } else { 15 }; // y: i32 }let x = 5; let y = if x == 5 { 10 } else { 15 }; // y: i32
che possiamo (e forse dovremmo) scrivere così:
fn main() { let x = 5; let y = if x == 5 { 10 } else { 15 }; // y: i32 }let x = 5; let y = if x == 5 { 10 } else { 15 }; // y: i32
Ciò funziona perché l'if
è un'espressione. Il valore di tale espressione è
il valore dell'ultima espressione della diramazione scelta. Un if
senza un
else
ha sempre il valore ()
.