Immutabilité et Ombrage

Immutabilité par défaut

Une variable est immutable par défaut, c'est-à-dire qu'une fois liée à une valeur, cette dernière ne peut pas être changée:

fn main() {
    let x = 5;
    println!("The value of x is: {x}");
    //x = 6; // Ce code est invalide
    //println!("The value of x is: {x}");
}

Ainsi, pour qu'il soit valide, ce code doit être réécrit ainsi (noter le mot-clef mut):

fn main() {
    let mut x = 5;
    println!("The value of x is: {x}");
    x = 6; // Ce code est valide
    println!("The value of x is: {x}");
}

Ombrage

L'ombrage (shadowing) consiste à lier une nouvelle variable avec le même nom afin de modifier sa valeur:

fn main() {
    let x = 5;
    println!("The value of x is: {x}");
    let x = x + 1;
    println!("The value of x is: {x}");
}

La portée (scope) d'une variable liée est limitée à son bloc de définition et aux blocs enfants, à partir de l'endroit où elle est déclarée:

fn main() {
    let x = 5;  // x_1

    let x = x + 1; // x_2 = x_1 + 1

    {
        let x = x * 2; // x_3 = x_2 * 2
        println!("The value of x in the inner scope is: {x}"); // x_3
    }

    println!("The value of x is: {x}"); // x_2
}

On peut changer le type d'une variable:

fn main() {
    let spaces = "   ";
    let spaces = spaces.len();
    println!("{} spaces", spaces);
}

On ne peut pas changer le type d'une variable mutable:

fn main() {
    let mut spaces = "   ";
    // spaces = spaces.len(); // faux !
    println!("{} spaces", spaces);
}

Constantes

Une constante est déclarée avec le mot-clef const et doit être typée. La valeur d'une constante doit être calculable au moment de la compilation du code. La portée d'une constante est identique à celle d'une variable.

const SECONDS_IN_ONE_HOUR: u32 = 60 * 60;
const THREE_HOURS_IN_SECONDS: u32 = SECONDS_IN_ONE_HOUR * 3;

fn main() {
    println!("There are {} seconds in 3 hours.", THREE_HOURS_IN_SECONDS);
}