I cicli permettono di mantenere attivo un programma fino a quando non gli diciamo di spegnersi. Allo stesso modo anche le funzioni rimangono attive fino a quando una determinata condizione viene o non viene soddisfatta.
In Rust è possibile fare partire un ciclo senza nessun tipo di condizione con loop. Poi indichiamo al programma di interrompere l’istruzione che sta eseguendo con break. Possiamo anche assegnare un’etichetta al loop e inserire al suo interno altri cicli etichettati. L’importante è che il ciclo più interno al blocco sia senza etichetta.
Con il termine while, creiamo un ciclo che rimane attivo fino a quando una condizione è vera. Utile per gestire il tempo rimasto in una partita o i punti in un videogioco. Il ciclo for in Rust funziona in modo diverso rispetto agli altri linguaggi: serve principalmente per iterare un intervallo di valori o gli elementi di una collezione come un array. Questo è un semplice esempio che utilizza loop e while:
fn main() {
let mut time = 200;
let mut score = 0;
let mut bonus = false;
'game: loop {
show_time(time);
show_score(score);
time = reduce_time(time, 1);
if bonus {
let mut time_bonus = 10;
while !is_time_over(time_bonus) {
time = reduce_time(time, 1);
score = add_score(score, 10);
time_bonus = reduce_time(time_bonus, 1);
if is_get_max_score(score) {
break 'game;
}
show_time(time);
show_score(score);
}
bonus = false;
}
//Attiviamo noi il bonus per provare.
enable_bonus(time, &mut bonus);
if is_time_over(time) {
break 'game;
}
}
println!("Game Over! Final Score: {}", score);
}
fn show_time(time: i32) {
println!("Time {}", time);
}
fn show_score(score: i32) {
println!("Score {}", score);
}
fn enable_bonus(time: i32, bonus: &mut bool) {
if time == 150 {
*bonus = true;
}
}
fn reduce_time(time: i32, amount: i32) -> i32 {
time - amount
}
fn add_score(score: i32, amount: i32) -> i32 {
score + amount
}
fn is_time_over(time: i32) -> bool {
time == 0
}
fn is_get_max_score(score: i32) -> bool {
score == 100
}