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 }
标签:变量,关键字,push,let,遮蔽,println,RUST From: https://www.cnblogs.com/hdhx-lh/p/16585133.html