RUST基础:变量遮蔽

Rust基础入门书籍推荐《深入浅出RUST》

Rust 是允许在同一个代码块中声明同样名字的变量。如果这样做,后面声明的变量会将前面声明的变量“遮蔽(Shadowing)”起来。如:

1 fn main() {
2     let x = "hello";
3     println!("x is {}",x);
4 
5     let x = 5;
6     println!("new x is {} ",x)
7 }

 

 

输出结果为:

 

 

 我们可以看到上面的程序是可以编译通过并顺利打印出结果的。请注意第5行的代码,它不是x=5;,他前面有一个let关键字。如果没有let这个关键字。这条语句就是对x的重新绑定(重新赋值)。而有了这个let关键字,就是又声明一个新的变量,只是它的名字恰巧与前面的一个变量相同而已。

没有let关键字的声明x的情况下:

 

 

会报如此的错误

 

 虽然两个变量名都是x,但是它们内存空间完全不同,类型也完全不同,因为它们实际上是两个不同的变量。从第5行开始,一直到这个代码块结束,我们没有任何办法再去访问前一个x变量,因为它的名字已经被遮蔽了。

 

 

变量遮蔽在某些情况下是非常有用的,比如,我们需要在同一个函数内部把一个变量转换为另一个变量类型,但又不想给它们起不同的名字,再比如,在同一个函数内部,需要修改一个变量绑定的可变性。例如,我们对一个可变数组执行初始化,希望此时它是可读写的,但是初始化完成后,我们希望它只是只读的。可以这样做:

 1 fn main() {
 2     let mut v = Vec::new(); //v 必须是mut修饰,因为我们需要对它写入数据
 3     v.push(1);
 4     v.push(2);
 5     v.push(3);
 6 
 7     let v = v; //从这里往下,v变成了只读变量,可读写变量v已经被遮蔽,无法在访问
 8     for i in &v{
 9         println!("{}",i)
10     }
11 
12 }

同理,反过来,如果一个变量是不可变的,我们也可以通过变量遮蔽创建一个新的、可变的同名变量:

1 fn main() {
2     let v = Vec::new();
3     let mut v = v;
4     v.push(1);
5     println!("{:?}",v)
6 }

 

posted @ 2022-08-14 12:02  海的航行  阅读(45)  评论(0编辑  收藏  举报