pub struct OnceCell<T> { /* private fields */ }Expand description
๐ซ ๐ฑ
core
A cell which can nominally be written to only once.
๐sys/mem/cell re-exported from core::cell
๐
A cell which can nominally be written to only once.
This allows obtaining a shared &T reference to its inner value without copying or replacing
it (unlike Cell), and without runtime borrow checks (unlike RefCell). However,
only immutable references can be obtained unless one has a mutable reference to the cell
itself. In the same vein, the cell can only be re-initialized with such a mutable reference.
A OnceCell can be thought of as a safe abstraction over uninitialized data that becomes
initialized once written.
For a thread-safe version of this struct, see std::sync::OnceLock.
ยงExamples
use std::cell::OnceCell;
let cell = OnceCell::new();
assert!(cell.get().is_none());
let value: &String = cell.get_or_init(|| {
"Hello, World!".to_string()
});
assert_eq!(value, "Hello, World!");
assert!(cell.get().is_some());Implementationsยง
Sourceยงimpl<T> OnceCell<T>
impl<T> OnceCell<T>
1.70.0 ยท 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 uninitialized.
1.70.0 ยท Sourcepub fn get_mut(&mut self) -> Option<&mut T> โ
pub fn get_mut(&mut self) -> Option<&mut T> โ
Gets the mutable reference to the underlying value.
Returns None if the cell is uninitialized.
1.70.0 ยท Sourcepub fn set(&self, value: T) -> Result<(), T> โ
pub fn set(&self, value: T) -> Result<(), T> โ
Initializes the contents of the cell to value.
ยงErrors
This method returns Ok(()) if the cell was uninitialized
and Err(value) if it was already initialized.
ยงExamples
use std::cell::OnceCell;
let cell = OnceCell::new();
assert!(cell.get().is_none());
assert_eq!(cell.set(92), Ok(()));
assert_eq!(cell.set(62), Err(62));
assert!(cell.get().is_some());Sourcepub fn try_insert(&self, value: T) -> Result<&T, (&T, T)> โ
๐ฌThis is a nightly-only experimental API. (once_cell_try_insert)
pub fn try_insert(&self, value: T) -> Result<&T, (&T, T)> โ
once_cell_try_insert)Initializes the contents of the cell to value if the cell was
uninitialized, then returns a reference to it.
ยงErrors
This method returns Ok(&value) if the cell was uninitialized
and Err((¤t_value, value)) if it was already initialized.
ยงExamples
#![feature(once_cell_try_insert)]
use std::cell::OnceCell;
let cell = OnceCell::new();
assert!(cell.get().is_none());
assert_eq!(cell.try_insert(92), Ok(&92));
assert_eq!(cell.try_insert(62), Err((&92, 62)));
assert!(cell.get().is_some());1.70.0 ยท 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 to f()
if the cell was uninitialized.
ยงPanics
If f() panics, the panic is propagated to the caller, and the cell
remains uninitialized.
It is an error to reentrantly initialize the cell from f. Doing
so results in a panic.
ยงExamples
use std::cell::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);Sourcepub fn get_mut_or_init<F>(&mut self, f: F) -> &mut Twhere
F: FnOnce() -> T,
๐ฌThis is a nightly-only experimental API. (once_cell_get_mut)
pub fn get_mut_or_init<F>(&mut self, f: F) -> &mut Twhere
F: FnOnce() -> T,
once_cell_get_mut)Gets the mutable reference of the contents of the cell,
initializing it to f() if the cell was uninitialized.
ยงPanics
If f() panics, the panic is propagated to the caller, and the cell
remains uninitialized.
ยงExamples
#![feature(once_cell_get_mut)]
use std::cell::OnceCell;
let mut cell = OnceCell::new();
let value = cell.get_mut_or_init(|| 92);
assert_eq!(*value, 92);
*value += 2;
assert_eq!(*value, 94);
let value = cell.get_mut_or_init(|| unreachable!());
assert_eq!(*value, 94);Sourcepub fn get_or_try_init<F, E>(&self, f: F) -> Result<&T, E> โ
๐ฌThis is a nightly-only experimental API. (once_cell_try)
pub fn get_or_try_init<F, E>(&self, f: F) -> Result<&T, E> โ
once_cell_try)Gets the contents of the cell, initializing it to f() if
the cell was uninitialized. If the cell was uninitialized
and f() failed, an error is returned.
ยงPanics
If f() panics, the panic is propagated to the caller, and the cell
remains uninitialized.
It is an error to reentrantly initialize the cell from f. Doing
so results in a panic.
ยงExamples
#![feature(once_cell_try)]
use std::cell::OnceCell;
let cell = OnceCell::new();
assert_eq!(cell.get_or_try_init(|| Err(())), Err(()));
assert!(cell.get().is_none());
let value = cell.get_or_try_init(|| -> Result<i32, ()> {
Ok(92)
});
assert_eq!(value, Ok(&92));
assert_eq!(cell.get(), Some(&92))Sourcepub fn get_mut_or_try_init<F, E>(&mut self, f: F) -> Result<&mut T, E> โ
๐ฌThis is a nightly-only experimental API. (once_cell_get_mut)
pub fn get_mut_or_try_init<F, E>(&mut self, f: F) -> Result<&mut T, E> โ
once_cell_get_mut)Gets the mutable reference of the contents of the cell, initializing
it to f() if the cell was uninitialized. If the cell was uninitialized
and f() failed, an error is returned.
ยงPanics
If f() panics, the panic is propagated to the caller, and the cell
remains uninitialized.
ยงExamples
#![feature(once_cell_get_mut)]
use std::cell::OnceCell;
let mut cell: OnceCell<u32> = OnceCell::new();
// Failed attempts to initialize the cell do not change its contents
assert!(cell.get_mut_or_try_init(|| "not a number!".parse()).is_err());
assert!(cell.get().is_none());
let value = cell.get_mut_or_try_init(|| "1234".parse());
assert_eq!(value, Ok(&mut 1234));
let Ok(value) = value else { return; };
*value += 2;
assert_eq!(cell.get(), Some(&1236))1.70.0 (const: 1.83.0) ยท Sourcepub const fn into_inner(self) -> Option<T> โ
pub const fn into_inner(self) -> Option<T> โ
Consumes the cell, returning the wrapped value.
Returns None if the cell was uninitialized.
ยงExamples
use std::cell::OnceCell;
let cell: OnceCell<String> = OnceCell::new();
assert_eq!(cell.into_inner(), None);
let cell = OnceCell::new();
let _ = cell.set("hello".to_owned());
assert_eq!(cell.into_inner(), Some("hello".to_owned()));1.70.0 ยท Sourcepub fn take(&mut self) -> Option<T> โ
pub fn take(&mut self) -> Option<T> โ
Takes the value out of this OnceCell, moving it back to an uninitialized state.
Has no effect and returns None if the OnceCell is uninitialized.
Safety is guaranteed by requiring a mutable reference.
ยงExamples
use std::cell::OnceCell;
let mut cell: OnceCell<String> = OnceCell::new();
assert_eq!(cell.take(), None);
let mut cell = OnceCell::new();
let _ = cell.set("hello".to_owned());
assert_eq!(cell.take(), Some("hello".to_owned()));
assert_eq!(cell.get(), None);Trait Implementationsยง
impl<T> !Sync for OnceCell<T>
impl<T> Eq for OnceCell<T>where
T: Eq,
Auto Trait Implementationsยง
impl<T> !Freeze for OnceCell<T>
impl<T> !RefUnwindSafe for OnceCell<T>
impl<T> Send for OnceCell<T>where
T: Send,
impl<T> Unpin for OnceCell<T>where
T: Unpin,
impl<T> UnsafeUnpin for OnceCell<T>where
T: UnsafeUnpin,
impl<T> UnwindSafe for OnceCell<T>where
T: UnwindSafe,
Blanket Implementationsยง
Sourceยงimpl<T> AnyExt for T
impl<T> AnyExt for T
Sourceยงfn type_hash_with<H: Hasher>(&self, hasher: H) -> u64
fn type_hash_with<H: Hasher>(&self, hasher: H) -> u64
TypeId of Self using a custom hasher.Sourceยงfn as_any_mut(&mut self) -> &mut dyn Anywhere
Self: Sized,
fn as_any_mut(&mut self) -> &mut dyn Anywhere
Self: Sized,
Sourceยงfn as_any_box(self: Box<Self>) -> Box<dyn Any>where
Self: Sized,
fn as_any_box(self: Box<Self>) -> Box<dyn Any>where
Self: Sized,
alloc only.Sourceยงimpl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Sourceยงfn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Sourceยงimpl<T> ByteSized for T
impl<T> ByteSized for T
Sourceยงconst BYTE_ALIGN: usize = _
const BYTE_ALIGN: usize = _
Sourceยงfn byte_align(&self) -> usize
fn byte_align(&self) -> usize
Sourceยงfn ptr_size_ratio(&self) -> [usize; 2]
fn ptr_size_ratio(&self) -> [usize; 2]
Sourceยงimpl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Sourceยงimpl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Sourceยงimpl<T> MemExt for Twhere
T: ?Sized,
impl<T> MemExt for Twhere
T: ?Sized,
Sourceยงconst NEEDS_DROP: bool = _
const NEEDS_DROP: bool = _
Sourceยงfn mem_align_of<T>() -> usize
fn mem_align_of<T>() -> usize
Sourceยงfn mem_align_of_val(&self) -> usize
fn mem_align_of_val(&self) -> usize
Sourceยงfn mem_size_of<T>() -> usize
fn mem_size_of<T>() -> usize
Sourceยงfn mem_size_of_val(&self) -> usize
fn mem_size_of_val(&self) -> usize
Sourceยงfn mem_needs_drop(&self) -> bool
fn mem_needs_drop(&self) -> bool
true if dropping values of this type matters. Read moreSourceยงfn mem_forget(self)where
Self: Sized,
fn mem_forget(self)where
Self: Sized,
self without running its destructor. Read moreSourceยงfn mem_replace(&mut self, other: Self) -> Selfwhere
Self: Sized,
fn mem_replace(&mut self, other: Self) -> Selfwhere
Self: Sized,
Sourceยงunsafe fn mem_zeroed<T>() -> T
unsafe fn mem_zeroed<T>() -> T
unsafe_layout only.T represented by the all-zero byte-pattern. Read moreSourceยงunsafe fn mem_transmute_copy<Src, Dst>(src: &Src) -> Dst
unsafe fn mem_transmute_copy<Src, Dst>(src: &Src) -> Dst
unsafe_layout only.T represented by the all-zero byte-pattern. Read moreSourceยงfn mem_as_bytes(&self) -> &[u8] โ
fn mem_as_bytes(&self) -> &[u8] โ
unsafe_slice only.