变量
1 | let variable : i32 = 100; |
这段代码会报错,变量是只读的。mut关键字申明的变量才是可写的。
1 | let mut x = 5; // mut x: i32 |
mut x是一个“模式”,我们还可以用这种方式同时声明多个变量
1 | let (mut a, mut b) = (1, 2); |
Rust中,每个变量必须被合理初始化之后才能被使用。
编译器会帮我们做一个执行路径的静态分析,确保变量在使用前一定被初始化:
1 | fn test(condition: bool) { |
变量遮蔽,这两个x代表的内存空间完全不同,类型也完全不同,它们实际上是两个不同的变量。
作用 1.在同一个函数内部把一个变量转换为另一个类型的变量,但又不想给它们起不同的名字
2. 在同一个函数内部,需要修改一个变量绑定的可变性
1 | fn main() { |
1 | // 注意:这段代码只是演示变量遮蔽功能,并不是Vec类型的最佳初始化方法 |
类型推导
1 | fn main() { |
类型别名
1 | type Age = u32; |
使用Double
type Double
静态变量
static GLOBAL: i32 = 0;
占用的内存空间不会在程序执行期间回收
必须在声明的同时进行初始化
初始化必须是编译期可确定的常量
带有mut修饰的全局变量,在使用的时候必须使用unsafe关键字
fn main() {
//局部变量声明,可以留待后面初始化,只要保证使用前已经初始化即可
let x;
let y = 1_i32;
x = 2_i32;
println!("{} {}", x, y);
//全局变量必须声明的时候初始化,因为全局变量可以写到函数外面,被任意一个函数使用
static G1 : i32 = 3;
println!("{}", G1);
//可变全局变量无论读写都必须用 unsafe修饰
static mut G2 : i32 = 4;
unsafe {
G2 = 5;
println!("{}", G2);
}
//全局变量的内存不是分配在当前函数栈上,函数退出的时候,并不会销毁全局变量占用的内存空间,程序
退出才会回收
}
常量
const GLOBAL: i32 = 0;
不允许使用mut关键字修饰
一定要是一个编译期常量,不能是运行期的值
它与static变量的最大区别:编译器并不一定会给const常量分配内存空间,在编译过程中,它很可能会被内联优化。因此,用户千万不要用hack的方式,通过unsafe代码去修改常量的值,这么做是没有意义的。以const声明一个常量,也不具备类似let语句的模式匹配功能。