在实际项目开发中,难免需要用到全局变量,比如全局配置信息,全局内存池等,此类数据结构可能在多处需要被使用,保存为全局变量可以很方便的进行修改与读取。
在Rust中,如果只是读取静态变量是比较简单的,比如全局变量是一个usize
或者& str
等类型的值。如果全局变量是需要初始化产生的就比较复杂了,比如解析一个配置文件,然后把配置文件中的内容赋给全局变量。由于全局变量要被修改,这个全局变量得是可变的,也就是说产生了全局可变变量,而这种方式范围了Rust的设计原则。
目前一种可行的方式是使用lazy_static库,典型使用方法如下所示。
struct Config {
id: u64,
}
impl Config {
fn new() -> Config {
Config {
id: 0,
}
}
}
lazy_static::lazy_static! {
static ref CACHE: Mutex<Config> = Mutex::new(Config::new());
}
fn func1() {
CACHE.lock().unwrap().id = 1;
}
fn func2() {
CACHE.lock().unwrap().id = 2;
}
fn func3() -> u64 {
return CACHE.lock().unwrap().id;
}
fn main() {
func1();
let id1 = func3();
println!("id1 = {}", id1);
func2();
let id2 = func3();
println!("id2 = {}", id2);
}
由于全局变量几乎是不可能完全舍弃的,所以大多数Rust项目里都使用到了lazy_static。
lazy_static底层基于宏实现,后续将继续展开分析。
网友评论