变量与可变性
变量
声明变量使用let
关键字,在默认情况下,变量是不可变的(Immutable)。
为此解决该问题,声明变量时在前面加上 mut
,就可以使变量可变
常量
常量(constant),在绑定值之后也是不可变的,但是与不可变的变量有很多区别:
-
不可以使用
mut
,常量永远是不变的 -
声明常量用
const
关键字,类型必须被标注 -
常量可以在任何作用域中声明,包括全局作用域
-
常量只可以绑定到常量表达式,无法绑定到函数的调用结果或只能在运行时才能计算出的值
在程序运行期间。常量在其声明的作用域内一直有效
shadowing(隐藏)
可以使用相同的名字声明新的变量,新的变量就会隐藏之前声明的同名变量,在后续代码中这个变量名表示的是新的变量
shadow
和把变量标记为mut
是不同的:
- 如果不使用
let
关键字,重新给非mut
的变量赋值会导致编译时错误(就是上面所说的变量是不可变的) - 而使用let声明的同名新变量,也是不可变的
- 使用
let
声明的同名新变量,它的类型可以与之前不同
let _kk=1;
println!("{}",_kk);
let _kk = 2;
println!("{}",_kk);let _xx = "123";
print_type_of(&_xx); //&str
let _xx = _xx.len();
print_type_of(&_xx); //usize