变量声明

语法格式:

1
2
let 变量名: 变量类型 = 变量值;
let var: i32 = 123;

有几点要注意:

  • 以关键字let开头,类型一定跟在冒号:后面;
  • 变量必须先声明,初始化后才能使用;

初始化

Rust中,每个变量必须被合理的初始化后才能被使用。使用未初始化的变量,不能被编译通过。

1
2
3
let x: i32;
println!("x = {}", x);
//运行报错:use of possibly-uninitialized `x`

编译器会帮我们做一个执行路径的静态分析,确保变量在使用前一定被初始化。

1
2
3
4
5
6
7
let x: i32;     //声明x,不使用mut修饰
if 条件 {
   x = 123;    //初始化x,这里不用使用mut修饰,因为这是初始化吗,不是修改
   println!("x = {}", x);
}
//如果条件不满足,则x未被初始化
//但是只要下面不适用x就不会报错

可变性

Rust中变量默认是不可变的,比如下面运行会报错:

1
2
3
let x: i32 = 123;
x = 456;
//运行报错:cannot assign twice to immutable variable

如果想让变量可写,可以使用关键字mut

1
2
let mut x: i32 = 123;
x = 456;

此时,变量才是可读写的。 实际上,let语句在这里引入了模式解构,mut x应该被视为一个组合,还可以使用这个方式声明多个变量。

1
2
let (mut a, mut b) = (1, 2);
let Piont{x: ref a, y: ref b} = p;

隐藏性

看下面代码:

1
2
3
let x = 5;
let x = x + 1;
let x = "你好";

我们可以定义一个与之前变量同名的变量,而且不会报错,新变量会隐藏之前的变量,我们称之为第一个变量被第二个变量隐藏了。

隐藏性和mut的区别

  • 当对同名变量重新赋值时,如果没有使用let会导致编译错误;
  • 当再次使用let时,实际上新创建了变量,我们可以改变变量的类型,但复用这个名字;

和常量的区别

  • 不允许对常量使用mut
  • 声明常量使用const关键字,而不是let
  • 必须注明常量的类型;
  • 常量可以在任何作用域声明,包括全局作用域;
  • 常量只能被设置为常量表达式,而不能是函数调用的结果,或任何其他只能在运行时计算出的值;