Struct OnceCell
struct OnceCell<T> { ... }
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 OnceCell;
let cell = new;
assert!;
let value: &String = cell.get_or_init;
assert_eq!;
assert!;
Implementations
impl<T> OnceCell<T>
const fn new() -> OnceCell<T>Creates a new uninitialized cell.
fn get(self: &Self) -> Option<&T>Gets the reference to the underlying value.
Returns
Noneif the cell is uninitialized.fn get_mut(self: &mut Self) -> Option<&mut T>Gets the mutable reference to the underlying value.
Returns
Noneif the cell is uninitialized.fn set(self: &Self, value: T) -> Result<(), T>Initializes the contents of the cell to
value.Errors
This method returns
Ok(())if the cell was uninitialized andErr(value)if it was already initialized.Examples
use OnceCell; let cell = new; assert!; assert_eq!; assert_eq!; assert!;fn try_insert(self: &Self, value: T) -> Result<&T, (&T, T)>Initializes the contents of the cell to
valueif the cell was uninitialized, then returns a reference to it.Errors
This method returns
Ok(&value)if the cell was uninitialized andErr((¤t_value, value))if it was already initialized.Examples
use OnceCell; let cell = new; assert!; assert_eq!; assert_eq!; assert!;fn get_or_init<F>(self: &Self, f: F) -> &T where F: FnOnce() -> TGets 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 OnceCell; let cell = new; let value = cell.get_or_init; assert_eq!; let value = cell.get_or_init; assert_eq!;fn get_mut_or_init<F>(self: &mut Self, f: F) -> &mut T where F: FnOnce() -> TGets 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
use OnceCell; let mut cell = new; let value = cell.get_mut_or_init; assert_eq!; *value += 2; assert_eq!; let value = cell.get_mut_or_init; assert_eq!;fn get_or_try_init<F, E>(self: &Self, f: F) -> Result<&T, E> where F: FnOnce() -> Result<T, E>Gets the contents of the cell, initializing it to
f()if the cell was uninitialized. If the cell was uninitialized andf()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
use OnceCell; let cell = new; assert_eq!; assert!; let value = cell.get_or_try_init; assert_eq!; assert_eq!fn get_mut_or_try_init<F, E>(self: &mut Self, f: F) -> Result<&mut T, E> where F: FnOnce() -> Result<T, E>Gets the mutable reference of the contents of the cell, initializing it to
f()if the cell was uninitialized. If the cell was uninitialized andf()failed, an error is returned.Panics
If
f()panics, the panic is propagated to the caller, and the cell remains uninitialized.Examples
use OnceCell; let mut cell: = new; // Failed attempts to initialize the cell do not change its contents assert!; assert!; let value = cell.get_mut_or_try_init; assert_eq!; let Ok = value else ; *value += 2; assert_eq!const fn into_inner(self: Self) -> Option<T>Consumes the cell, returning the wrapped value.
Returns
Noneif the cell was uninitialized.Examples
use OnceCell; let cell: = new; assert_eq!; let cell = new; let _ = cell.set; assert_eq!;fn take(self: &mut Self) -> Option<T>Takes the value out of this
OnceCell, moving it back to an uninitialized state.Has no effect and returns
Noneif theOnceCellis uninitialized.Safety is guaranteed by requiring a mutable reference.
Examples
use OnceCell; let mut cell: = new; assert_eq!; let mut cell = new; let _ = cell.set; assert_eq!; assert_eq!;
impl<T> Any for OnceCell<T>
fn type_id(self: &Self) -> TypeId
impl<T> Borrow for OnceCell<T>
fn borrow(self: &Self) -> &T
impl<T> BorrowMut for OnceCell<T>
fn borrow_mut(self: &mut Self) -> &mut T
impl<T> CloneToUninit for OnceCell<T>
unsafe fn clone_to_uninit(self: &Self, dest: *mut u8)
impl<T> Default for OnceCell<T>
fn default() -> Self
impl<T> Freeze for OnceCell<T>
impl<T> From for OnceCell<T>
fn from(value: T) -> SelfCreates a new
OnceCell<T>which already contains the givenvalue.
impl<T> From for OnceCell<T>
fn from(t: T) -> TReturns the argument unchanged.
impl<T> From for OnceCell<T>
fn from(t: never) -> T
impl<T> RefUnwindSafe for OnceCell<T>
impl<T> Send for OnceCell<T>
impl<T> Sync for OnceCell<T>
impl<T> Unpin for OnceCell<T>
impl<T> UnsafeUnpin for OnceCell<T>
impl<T> UnwindSafe for OnceCell<T>
impl<T, U> Into for OnceCell<T>
fn into(self: Self) -> UCalls
U::from(self).That is, this conversion is whatever the implementation of
[From]<T> for Uchooses to do.
impl<T, U> TryFrom for OnceCell<T>
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
impl<T, U> TryInto for OnceCell<T>
fn try_into(self: Self) -> Result<U, <U as TryFrom<T>>::Error>
impl<T: Clone> Clone for OnceCell<T>
fn clone(self: &Self) -> OnceCell<T>
impl<T: Eq> Eq for OnceCell<T>
impl<T: PartialEq> PartialEq for OnceCell<T>
fn eq(self: &Self, other: &Self) -> bool
impl<T: fmt::Debug> Debug for OnceCell<T>
fn fmt(self: &Self, f: &mut Formatter<'_>) -> Result