Skip to content

变量

Rust 中有变量和常量。

声明变量用 let 关键字,声明常量用 const 关键字。

let   variable = 1;
const constant = 0;

变量

Rust 中的变量默认是,immutable,不可变的。

因为 Rust 认为应该显式地区分可变和不可变。默认不可变是因为,据统计,一般而言不被修改的变量要比被修改的变量多。不可变变量有利于防止一些傻叉修改了本不该修改的值导致灾难。

要使得变量可变,需要加上 mut 关键字。

let mut var1 = 1;   // 这样 var1 就可以被修改
var1 = 10;

常量

const 初始化常量,通常是 1, 2, 3 这种字面量,或者常量函数的返回值。

  • 常量可以在任何作用域内声明,包括全局作用域。
  • 常量只能绑定到常量表达式,无法绑定到函数的调用结果,或只能在运行时才能计算出的值。
  • 程序运行期间,常量在其作用域内一直有效。

Tip

letconst 的区别在于: let 在初始化在程序中是不确定的,且声明与赋值可以分开。const 赋值只能赋字面量,在初始化时值是确定的;

  • let 声明的是变量,const 声明的是常量;
  • let 能类型推导,const 不能类型推导,在声明时必须指定类型;
  • let 可以使用 mut 关键字使得变量可变。const 不可以使用 mut 关键字,常量永远不可变。

Tip

常量命名规范为:全大写,用下划线连接。

const PI: f64 = 3.14;

影藏 Shadowing

Rust 中可以使用相同的名字声明新的变量,新的变量就会 shadow(影藏)之前声明的同名变量,在后续的代码中这个变量名代表的就是新的变量。

fn main() {
    let x = 5;
    let x = x + 1;  // 影藏 x,此时 x 为 6
    let x = x * 3;  // 影藏 x,此时 x 为 18
}

shadow 和把变量标记为 mut 不同,如果不使用 let 关键字,那么重新给非 mut 变量赋值会报错。

  • 使用 let 声明同名变量(影藏),也是不可变的。

    let x = 5;
    let x = 6;
    x = 7; 
    

  • 影藏的时候可以改变变量的可变性

    let mut x = 5; // 声明一个可变变量
    x = 6;         // 这里修改 x 的值是没问题的
    
    let x = 7;  // 影藏 x,同时 x 变成一个不可变变量,重新赋值会报错
    x = 8;      // cannot assign twice to immutable variable `x` 
    

    let x = 5;      // 声明一个不可变变量
    let mut x = 7;  // 影藏 x,同时 x 变成一个可变变量,重新赋值不会报错
    x = 8;          // 这里修改 x 的值是没问题的
    
  • 影藏的时候可以改变变量的类型

    let x:i64 = 100;    // 声明一个 int64 的变量
    let x = "abc";      // 影藏 x,同时改变它的类型,这是没问题的。