全局变量
提示
所有帖子都会不定期添加补充实战过程中发现的新内容,力争一篇文章涵盖所有内容,避免你多次查找文章,所以最好点赞或收藏,时不时回来看看。
废话
rust不建议全局变量,但实际应用又需要,所以可以用下面的方式使用全局变量,全局变量使用static来声明。用static声明的变量生命周期是整个程序,从启动到退出,它占用的内存空间也不会在执行过程中回收,这也是rust中唯一声明全局变量的方法,全局变量使用有一些限制,都是为了防止你写出不安全的代码:
1.全局变量在声明时要初始化成编译期可确定的常量,不能是执行时才能确定的表达式、语句、函数调用的结果;
2.带有mut修饰的全局变量,在使用时必须要用unsafe操作;
使用全局变量
static GA: i32 = 0;
static mut GB: i32 = 1;
static mut PERSON: Person = Person {
age: 9};
struct Person {
age: u8,
}
fn main() {
println!("GA is {}", GA); // 如果全局变量不修改,应该用常量更合适
unsafe {
// 修改可变的全局变量是不安全的,要unsafe
GB = 3;
println!("GB is {}", GB);
PERSON.age = 19;
println!("person.age is {}", PERSON.age);
}
}
执行结果:
GA is 0
GB is 3
person.age is 19
使用lazy_static!
lazy_static!是个第三方的东西,目前没有找到如何修改全局变量(如有知道请留言告诉我),使用前要在Cargo.toml里添加
[dependencies]
lazy_static = "1.4.0"
use lazy_static::lazy_static;
struct Person {
age: u8,
}
fn main() {
// static 懒加载,无需在编译时计算其值,在首次访问时进行初始化
lazy_static! {
static ref GPERSON: Person = Person {
age: 9};
}
println!("person.age is {}", GPERSON.age);
}
执行结果:
person.age is 9