Struct singletonum::OnceCell
source · pub struct OnceCell<T> { /* private fields */ }
Expand description
A thread-safe cell which can be written to only once.
Unlike ::std::sync::Mutex
, a OnceCell
provides simple &
references to the contents.
Example
use once_cell::sync::OnceCell;
static CELL: OnceCell<String> = OnceCell::INIT;
assert!(CELL.get().is_none());
::std::thread::spawn(|| {
let value: &String = CELL.get_or_init(|| {
"Hello, World!".to_string()
});
assert_eq!(value, "Hello, World!");
}).join().unwrap();
let value: Option<&String> = CELL.get();
assert!(value.is_some());
assert_eq!(value.unwrap().as_str(), "Hello, World!");
Implementations§
source§impl<T> OnceCell<T>
impl<T> OnceCell<T>
sourcepub const INIT: OnceCell<T> = OnceCell{ once: ONCE_INIT, value: UnsafeCell::new(None),}
pub const INIT: OnceCell<T> = OnceCell{ once: ONCE_INIT, value: UnsafeCell::new(None),}
An empty cell, for initialization in a const
context.
sourcepub fn get(&self) -> Option<&T>
pub fn get(&self) -> Option<&T>
Gets the reference to the underlying value. Returns None
if the cell is empty.
sourcepub fn set(&self, value: T) -> Result<(), T>
pub fn set(&self, value: T) -> Result<(), T>
Sets the contents of this cell to value
. Returns
Ok(())
if the cell was empty and Err(value)
if it was
full.
Example
use once_cell::sync::OnceCell;
static CELL: OnceCell<i32> = OnceCell::INIT;
fn main() {
assert!(CELL.get().is_none());
::std::thread::spawn(|| {
assert_eq!(CELL.set(92), Ok(()));
}).join().unwrap();
assert_eq!(CELL.set(62), Err(62));
assert_eq!(CELL.get(), Some(&92));
}
sourcepub fn get_or_init<F>(&self, f: F) -> &Twhere
F: FnOnce() -> T,
pub fn get_or_init<F>(&self, f: F) -> &Twhere
F: FnOnce() -> T,
Gets the contents of the cell, initializing it with f
if the cell was empty. May threads may call get_or_init
concurrently with different initializing functions, but
it is guaranteed that only one function will be executed.
Example
use once_cell::sync::OnceCell;
let cell = OnceCell::new();
let value = cell.get_or_init(|| 92);
assert_eq!(value, &92);
let value = cell.get_or_init(|| unreachable!());
assert_eq!(value, &92);