变量与可变性

不可变变量

  1. 变量默认是不可改变的
  2. 默认 let 声明的变量为不可变的。
fn main() {
    let x = 5; // 声明变量,默认不可变
    println!("The value of x is: {}", x);
    x = 6; // 因为 x 是不可变变量,所以此处会报错
    println!("The value of x is: {}", x);
}

可变变量

  1. 使用 mut 关键字声明为可变的。
fn main() {
    let mut x = 5; // 使用 mut 声明可变变量
    println!("The value of x is: {}", x);
    x = 6; // 因为x是可变变量,所以不会报错。
    println!("The value of x is: {}", x);
}

常量

  1. 使用 const 关键字声明常量。
  2. 不允许对常量 使用 mut。
  3. 常量可以在任何作用域中声明,包括全局作用域。
  4. 常量只能被设置为常量表达式,而不能是只能在运行时计算出的值。

fn main() {
    const THREE_HOURS_IN_SECONDS: u32 = 60 * 60 * 3;
}

隐藏(Shadowing)

  1. 可以定义一个与之前变量同名的新变量。
fn main() {
    let x = 5;  // 第一次声明的变量 x

    let x = x + 1;  // 第二次声明,隐藏第第一个声明的变量 x

    {
        let x = x * 2;  // 第三次声明在本作用域内隐藏第二次声明的变量x
        println!("The value of x in the inner scope is: {}", x);
    }

    println!("The value of x is: {}", x);  // 使用第二次声明的变量 x
}

隐藏版本2

  1. 使用 let 时,实际上创建了一个新变量,我们可以 改变值的类型,并且复用这个名字。
fn main() {
    let spaces = "   ";  // string类型
    let spaces = spaces.len();  // 隐藏并更改为 u32 类型
}

对于 使用 mut 的可变变量, 隐藏上一个变量时,不可改变类型

fn main() {
    let mut spaces = "   "; // 可变的,string类型变量
    spaces = spaces.len(); // 转化为u32类型,会报错。
}