常量
常量
不允许改变值的变量,可能会使你想起另一个大部分编程语言都有的概念:常量(constants
首先,不允许对常量使用
这是一个声明常量的例子,它的名称是
const MAX_POINTS: u32 = 100_000;
在声明它的作用域之中,常量在整个程序生命周期中都有效,这使得常量可以作为多处代码使用的全局范围的值,例如一个游戏中所有玩家可以获取的最高分或者光速。将遍布于应用程序中的硬编码值声明为常量,能帮助后来的代码维护人员了解值的意图。如果将来需要修改硬编码值,也只需修改汇聚于一处的硬编码值。
const 与static 对比
有两种不使用
const 是一个不变的值;static 是一个不变的值,并且具有固定的存储位置。
因此它们几乎相同。
const NUMBER_OF_MONTHS: u32 = 12;
const SEASONS: [&str; 4] = ["Spring", "Summer", "Fall", "Winter"];
这里对于不可变需要进行阐述,在
let a = vec![1, 2, 3]; //不可变绑定, a <=> 内存区域A(1,2,3)
let mut a = a; //可变绑定,a <=> 内存区域A(1,2,3), 注意此a已非上句a,只是名字一样而已
a.push(4);
println!("{:?}", a); //打印:[1, 2, 3, 4]
“可变绑定”后,目标内存还是同一块,只不过,可以通过新绑定的
let mut a: &str = "abc"; //可变绑定, a <=> 内存区域A("abc")
a = "xyz"; //绑定到另一内存区域, a <=> 内存区域B("xyz")
println!("{:?}", a); //打印:"xyz"
上面这种情况不要混淆了,a = "xyz"
表示 a
绑定目标资源发生了变化。其实,
const PI:f32 = 3.14;
可变性的目的就是严格区分绑定的可变性,以便编译器可以更好的优化,也提高了内存安全性。