I cicli in Rust: loop, while e for

I cicli in Rust

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
}