51个版本 (30个稳定版)
1.19.0 | 2023年12月7日 |
---|---|
1.18.0 | 2023年6月4日 |
1.17.2 | 2023年5月29日 |
1.17.1 | 2023年2月14日 |
0.1.6 | 2018年9月21日 |
在Rust模式中排名第6
每月下载量13,448,813
用于58,830个crate (5,719直接使用)
88KB
1K SLoC
概述
once_cell
提供了两种新的类似单元格的类型,unsync::OnceCell
和 sync::OnceCell
。 OnceCell
可以存储任意非Copy
类型,最多只能赋值一次,并提供对存储内容的直接访问。简单来说,API 大致如下
impl OnceCell<T> {
fn new() -> OnceCell<T> { ... }
fn set(&self, value: T) -> Result<(), T> { ... }
fn get(&self) -> Option<&T> { ... }
}
注意,与 RefCell
和 Mutex
一样,set
方法只需要一个共享引用。由于单次赋值限制,get
可以返回一个 &T
而不是 Ref<T>
或 MutexGuard<T>
once_cell
还有一个 Lazy<T>
类型,它在 OnceCell
的基础上构建,提供了与 lazy_static!
宏相同的API,但不需要使用任何宏
use std::{sync::Mutex, collections::HashMap};
use once_cell::sync::Lazy;
static GLOBAL_DATA: Lazy<Mutex<HashMap<i32, String>>> = Lazy::new(|| {
let mut m = HashMap::new();
m.insert(13, "Spica".to_string());
m.insert(74, "Hoyten".to_string());
Mutex::new(m)
});
fn main() {
println!("{:?}", GLOBAL_DATA.lock().unwrap());
}
更多模式和用法在文档中!
相关crate
- double-checked-cell
- lazy-init
- lazycell
- mitochondria
- lazy_static
- async_once_cell
- generic_once_cell (自行提供互斥锁)
once_cell
API的一部分已包含在Rust 1.70.0及以后的std
中。
依赖关系
~0–5MB