变量声明
语法格式:
let 变量名: 变量类型 = 变量值;
let var: i32 = 123;
有几点要注意:
- 以关键字
let
开头,类型一定跟在冒号:
后面; - 变量必须先声明,初始化后才能使用;
初始化
Rust中,每个变量必须被合理的初始化后才能被使用。使用未初始化的变量,不能被编译通过。
let x: i32;
println!("x = {}", x);
//运行报错:use of possibly-uninitialized `x`
编译器会帮我们做一个执行路径的静态分析,确保变量在使用前一定被初始化。
let x: i32; //声明x,不使用mut修饰
if 条件 {
x = 123; //初始化x,这里不用使用mut修饰,因为这是初始化吗,不是修改
println!("x = {}", x);
}
//如果条件不满足,则x未被初始化
//但是只要下面不适用x就不会报错
可变性
Rust中变量默认是不可变的,比如下面运行会报错:
let x: i32 = 123;
x = 456;
//运行报错:cannot assign twice to immutable variable
如果想让变量可写,可以使用关键字mut
。
let mut x: i32 = 123;
x = 456;
此时,变量才是可读写的。
实际上,let
语句在这里引入了模式解构,mut x
应该被视为一个组合,还可以使用这个方式声明多个变量。
let (mut a, mut b) = (1, 2);
let Piont{x: ref a, y: ref b} = p;
隐藏性
看下面代码:
let x = 5;
let x = x + 1;
let x = "你好";
我们可以定义一个与之前变量同名的变量,而且不会报错,新变量会隐藏之前的变量,我们称之为第一个变量被第二个变量隐藏了。
隐藏性和mut的区别
- 当对同名变量重新赋值时,如果没有使用
let
会导致编译错误; - 当再次使用
let
时,实际上新创建了变量,我们可以改变变量的类型,但复用这个名字;
和常量的区别
- 不允许对常量使用
mut
; - 声明常量使用
const
关键字,而不是let
; - 必须注明常量的类型;
- 常量可以在任何作用域声明,包括全局作用域;
- 常量只能被设置为常量表达式,而不能是函数调用的结果,或任何其他只能在运行时计算出的值;