Rust中的变量、常量和可变性
Rust默认情况下变量是不可变的;注意这里不可变的变量并不是常量,有编程经验的朋友可能会觉得一头雾水,让我们继续往下看;
看一段代码:
fn main() {
let x = 1; //使用 let 关键字声明变量并赋值
println!("the value of x is : {}",x);
x = 6;
println!("the value of x is : {}",x);
}
这段看似很平常的代码会造成编译错误:error[E0384]: cannot assign twice to immutable variable `x`

出现这个错误是以为你试图为一个不可变的变量赋值;
为什么会被设计成这样呢?如果我们代码的一部分假设一个值永远不会改变,而我们代码的另一部分则改变了该值,那么代码的第一部分可能不会按照设计的意图去执行;实际上,这种错误的原因可能很难追查;
变量仅在默认情况下是不可变的,你可以通过在变量名前添加 mut 关键字来使变量可以改变;不仅如此,它还能让你的代码更具有阅读性,mut 是 mutable 的缩写,意为可变的;
修改前面的代码:
fn main() {
let mut x = 1; //使用 let 关键字声明变量并赋值
println!("the value of x is : {}",x);
x = 6;
println!("the value of x is : {}",x);
}
编译这段代码并执行,将得到以下信息:
the value of x is : 1 the value of x is : 6
变量和常量之间的差异
无法更改的变量可能使你想起其它编程语言都具有的另一个概念:常量;
与不可变的变量一样,常量也是不允许更改的值,但它们之间存在一些差异:
首先,常量不允许使用 mut 关键字;默认情况下,常量是始终不可变的,而变量通过使用mut关键值能使其可以改变;
常量使用 const 关键字声明,而变量使用 let 关键字声明,且常量的值必须指定数据类型,而变量可以推断出其类型;
常量可以在任何范围内声明,包括全局范围;常量只能设置为固定值或常量表达式,在编译时就能计算出其结果;
常量的命名必须使用大写字母或数字和下划线;
const U_X2 :u32 = 100_1000; //在数字中插入下划线可提高可读性
遮蔽
不同于C语言,rust允许你声明一个已经声明过的变量名,并且该新变量会覆盖先前的变量,并且改变其类型,这点上有点像Python;
来看一段代码:
fn main() {
let x = 5;
let x = x + 1;
let x = x * 2;
println!("The value of x is: {}", x);
}
x 最终的值为 12;
这有点像使用mut关键字,但它们是不同的,如果你尝试不适用let关键字修改x,将产生编译错误;
和mut的另一个区别是,使用let再次声明变量时能改变值的类型:
fn main() {
let strings = "abcdefg";
let strings = strings.len(); // .len()获取字符串长度
println!("{}",strings);
}
第一个strings变量为字符串类型,第二个变量为数字类型;而使用mut关键字声明的变量不允许修改其类型:
let mut strings = "abcdefg";
strings = strings.len();
这段代码将造成编译错误error[E0308] : mismatched types,该错误表明类型不匹配。