rust变量遮蔽(shadowing)
前言
首先要理解rust对变量的分配,rust创建一个变量之后,分配一个内存空间,变量名是对这一个内存空间的命名。
一般默认情况下,变量是不可变的,因为rust为了安全,对内存的操作是很小心的。如果想要让变量可变,需要声明mut
// 此时是对同一地址的改变
let mut x = 5;
x =6
// 此时是两个不同内存地址, 只是对不同地址,使用同一个名字命名。
// 此时第一个x被shadowing了
let x = 5;
let x = 6;
这和 mut 变量的使用是不同的,第二个 let 生成了完全不同的新变量,两个变量只是恰好拥有同样的名称,涉及一次内存对象的再分配 ,而 mut 声明的变量,可以修改同一个内存地址上的值,并不会发生内存对象的再分配,性能要更好。
其实我并不认为这个是个好特性,变量遮蔽的作用是如果你在某个作用域内无需再使用之前的变量(在被遮蔽后,无法再访问到之前的同名变量),就可以重复的使用变量名字,而不用绞尽脑汁去想更多的名字。我感觉是个很鸡肋的功能
fn main() {
let x: i32 = 5;
let x = x+1;
println!("{}",x);
{
let x: i32 = 10;
println!("{}",x);
}
println!("{}",x);
}
输出结果为
6
10
6
作用域内的变量和作用域外的变量遮蔽
未使用变量两种声明方式
- 前面加下划线:
_x
- 开头进行声明:
#[allow(unused_variables)]