静态变量
静态变量
Rust 对静态变量有严格的限制:静态变量必须在编译时就有已知的大小,且必须是线程安全的
所以创建起来比其他语言更麻烦些
以下是demo: 需要静态弄一个hashMap
方法 1:使用 once_cell
Cargo.toml
[dependencies]
once_cell = "1.17.0" # 或者如果使用 once_cell
tracing = "0.1"use std::collections::HashMap;
use once_cell::sync::Lazy;
type TaskFn = fn() -> ();
pub fn log() {
    tracing::info!("log test");
}
pub fn getStatus() {
    tracing::info!("status: running");
}
// 静态 hashMap
static TASK_LIST: Lazy<HashMap<String, TaskFn>> = Lazy::new(|| {
    let mut map = HashMap::new();
    map.insert("log".to_string(), log);
    map.insert("status".to_string(), getStatus);
    map
});
// 使用示例
pub fn execute_task(name: &str) {
    if let Some(task) = TASK_LIST.get(name) {
        task();
    }
}方法 2:使用 lazy_static
Cargo.toml
[dependencies]
lazy_static = "1.4.0" # 如果使用 lazy_static
tracing = "0.1"use std::collections::HashMap;
use lazy_static::lazy_static;
type TaskFn = fn() -> ();
pub fn log() {
    tracing::info!("log test");
}
pub fn getStatus() {
    tracing::info!("status: running");
}
// 静态 hashMap
lazy_static! {
    static ref TASK_LIST: HashMap<String, TaskFn> = {
        let mut map = HashMap::new();
        map.insert("log".to_string(), log);
        map.insert("status".to_string(), getStatus);
        map
    };
}
// 使用示例
pub fn execute_task(name: &str) {
    if let Some(task) = TASK_LIST.get(name) {
        task();
    }
}比较
once_cell 是更现代的解决方案,而且它已经是 Rust 标准库的一部分(虽然还是实验性的)
链接到当前文件 0
没有文件链接到当前文件