#lazy #static

once_cell

Single assignment cells and lazy values

46 releases (25 stable)

Uses new Rust 2021

1.16.0 Oct 29, 2022
1.15.0 Sep 20, 2022
1.13.0 Jul 4, 2022
1.10.0 Mar 3, 2022
0.1.6 Sep 21, 2018

#2 in Rust patterns

Download history 1224417/week @ 2022-08-11 1260581/week @ 2022-08-18 1240884/week @ 2022-08-25 1299440/week @ 2022-09-01 1279463/week @ 2022-09-08 1256130/week @ 2022-09-15 1408349/week @ 2022-09-22 1251160/week @ 2022-09-29 1330138/week @ 2022-10-06 1320719/week @ 2022-10-13 1351803/week @ 2022-10-20 1348936/week @ 2022-10-27 1459222/week @ 2022-11-03 1427074/week @ 2022-11-10 1385223/week @ 2022-11-17 1045661/week @ 2022-11-24

5,569,609 downloads per month
Used in 30,316 crates (2,550 directly)

MIT/Apache

81KB
1K SLoC

once_cell

Build Status Crates.io API reference

Overview

once_cell provides two new cell-like types, unsync::OnceCell and sync::OnceCell. OnceCell might store arbitrary non-Copy types, can be assigned to at most once and provide direct access to the stored contents. In a nutshell, API looks roughly like this:

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

Note that, like with RefCell and Mutex, the set method requires only a shared reference. Because of the single assignment restriction get can return an &T instead of Ref<T> or MutexGuard<T>.

once_cell also has a Lazy<T> type, build on top of OnceCell which provides the same API as the lazy_static! macro, but without using any macros:

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());
}

More patterns and use-cases are in the docs!

Related crates

The API of once_cell is being proposed for inclusion in std.

Dependencies

~0–4.5MB
~70K SLoC