静态变量
静态变量
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
没有文件链接到当前文件