Dopo aver esplorato variabili, tipi di dati e operazioni di base, è arrivato il momento di gestire il flusso del programma in Rust. I costrutti come condizioni e cicli ti permettono di creare logica più complessa, mentre il potente match
consente di implementare pattern matching in modo elegante. Vediamo insieme come utilizzarli!
Le condizioni in Rust sono molto simili a quelle di altri linguaggi, ma con alcune caratteristiche uniche. La sintassi è semplice e diretta:
fn main() {
let numero = 10;
if numero > 5 {
println!("Il numero è maggiore di 5!");
} else {
println!("Il numero è minore o uguale a 5.");
}
}
fn main() {
let numero = 7;
if numero % 2 == 0 {
println!("Il numero è pari.");
} else if numero % 3 == 0 {
println!("Il numero è divisibile per 3.");
} else {
println!("Il numero non è divisibile né per 2 né per 3.");
}
}
In Rust, puoi usare if
anche come espressione per assegnare valori:
fn main() {
let condizione = true;
let numero = if condizione { 42 } else { 0 };
println!("Il numero è: {}", numero);
}
Rust offre tre tipi principali di cicli per soddisfare ogni esigenza: for
, while
e loop
.
Il ciclo for
è il più comune e iterativo. Funziona perfettamente con intervalli (ranges
).
fn main() {
for i in 1..5 {
println!("Valore di i: {}", i);
}
}
L'intervallo 1..5
genera i numeri da 1 a 4, escludendo il 5. Per includere il limite superiore, usa 1..=5
.
Il ciclo while
continua finché la condizione è vera.
fn main() {
let mut numero = 0;
while numero < 5 {
println!("Numero: {}", numero);
numero += 1;
}
}
Il ciclo loop
è infinito per definizione e deve essere interrotto manualmente con la parola chiave break
.
fn main() {
let mut contatore = 0;
loop {
println!("Contatore: {}", contatore);
contatore += 1;
if contatore == 5 {
break;
}
}
}
Rust offre un costrutto potente chiamato match
per effettuare controlli più complessi basati su pattern.
fn main() {
let numero = 3;
match numero {
1 => println!("Uno"),
2 => println!("Due"),
3 => println!("Tre"),
_ => println!("Altro numero"),
}
}
Il carattere _
è un wildcard che cattura tutti i casi non specificati.
Puoi usare intervalli per gestire casi specifici:
fn main() {
let voto = 85;
match voto {
90..=100 => println!("Eccellente"),
75..=89 => println!("Buono"),
60..=74 => println!("Sufficiente"),
_ => println!("Insufficiente"),
}
}
match
è particolarmente utile con gli enums:
enum Colore {
Rosso,
Verde,
Blu,
}
fn main() {
let colore = Colore::Verde;
match colore {
Colore::Rosso => println!("Il colore è Rosso"),
Colore::Verde => println!("Il colore è Verde"),
Colore::Blu => println!("Il colore è Blu"),
}
}
if-else
.for
per calcolare la somma dei numeri da 1 a 10.match
per tradurre numeri (da 1 a 5) in parole (es. 1 → Uno).Le strutture di controllo sono essenziali per ogni linguaggio di programmazione, e Rust le rende potenti e sicure. La combinazione di condizioni, cicli e pattern matching con match
ti consente di costruire logica complessa in modo semplice e leggibile.
Preparati per la prossima lezione, dove approfondiremo funzioni, scope e modularità per creare programmi ancora più organizzati e scalabili.