#lazy-evaluation #static

no-std once_cell

单次赋值单元格和延迟值

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

Download history 2705428/week @ 2024-05-01 2662555/week @ 2024-05-08 2750416/week @ 2024-05-15 2643881/week @ 2024-05-22 2844153/week @ 2024-05-29 2805805/week @ 2024-06-05 3104700/week @ 2024-06-12 2835663/week @ 2024-06-19 2817445/week @ 2024-06-26 2633315/week @ 2024-07-03 2997374/week @ 2024-07-10 2981754/week @ 2024-07-17 3057635/week @ 2024-07-24 3163178/week @ 2024-07-31 3423541/week @ 2024-08-07 3256880/week @ 2024-08-14

每月下载量13,448,813
用于58,830个crate (5,719直接使用)

MIT/Apache

88KB
1K SLoC

once_cell

Build Status Crates.io API reference

概述

once_cell 提供了两种新的类似单元格的类型,unsync::OnceCellsync::OnceCellOnceCell 可以存储任意非Copy 类型,最多只能赋值一次,并提供对存储内容的直接访问。简单来说,API 大致如下

impl OnceCell<T> {
    fn new() -> OnceCell<T> { ... }
    fn set(&self, value: T) -> Result<(), T> { ... }
    fn get(&self) -> Option<&T> { ... }
}

注意,与 RefCellMutex 一样,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

once_cell API的一部分已包含在Rust 1.70.0及以后的std中。

依赖关系

~0–5MB