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 ().