Struct OnceCell
pub struct OnceCell<T> { pub(in ::cell::once) inner: UnsafeCell<Option<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!;
Fields
inner: UnsafeCell<Option<T>>
Implementations
impl<T> OnceCell<T>
const fn new() -> OnceCell<T>Creates a new uninitialized cell.
const fn new_init(init_value: T) -> OnceCell<T>Creates a new initialized cell.
This is equivalent to
OnceCell::from(value), but can be used in const contexts, unlike theFromimplementation.Examples
use OnceCell; const CELL: = new_init; assert_eq!; let cell = new_init; assert_eq!; assert_eq!;fn get(&self) -> Option<&T>Gets the reference to the underlying value.
Returns
Noneif the cell is uninitialized.fn get_mut(&mut self) -> Option<&mut T>Gets the mutable reference to the underlying value.
Returns
Noneif the cell is uninitialized.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 andErr(value)if it was already initialized.Examples
use OnceCell; let cell = new; assert!; assert_eq!; assert_eq!; assert!;fn try_insert(&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, f: F) -> &T where 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 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>(&mut self, f: F) -> &mut T where F: FnOnce() -> T,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
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, 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>(&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!fn try_init<F, E>(&self, f: F) -> Result<&T, E> where F: FnOnce() -> Result<T, E>,const fn into_inner(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(&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!;
Trait Implementations
impl<T> !Sync for OnceCell<T>
impl<T> Default for OnceCell<T>
fn default() -> Self
impl<T> From<T> for OnceCell<T>
fn from(value: T) -> SelfCreates a new
OnceCell<T>which already contains the givenvalue.
impl<T: Clone> Clone for OnceCell<T>
fn clone(&self) -> OnceCell<T>
impl<T: Debug> Debug for OnceCell<T>
fn fmt(&self, f: &mut Formatter<'_>) -> Result
impl<T: Eq> Eq for OnceCell<T>
impl<T: PartialEq> PartialEq for OnceCell<T>
fn eq(&self, other: &Self) -> bool
Auto Trait Implementations
impl<T> !Freeze for OnceCell<T>
impl<T> !RefUnwindSafe for OnceCell<T>
impl<T> Send for OnceCell<T>
where
UnsafeCell<Option<T>>: Send,
impl<T> Unpin for OnceCell<T>
where
UnsafeCell<Option<T>>: Unpin,
impl<T> UnsafeUnpin for OnceCell<T>
where
UnsafeCell<Option<T>>: UnsafeUnpin,
impl<T> UnwindSafe for OnceCell<T>
where
UnsafeCell<Option<T>>: UnwindSafe,
Blanket Implementations
impl<T> Any for OnceCell<T>
where
T: 'static + ?Sized,
fn type_id(&self) -> TypeId
impl<T> Borrow<T> for OnceCell<T>
where
T: ?Sized,
fn borrow(&self) -> &T
impl<T> BorrowMut<T> for OnceCell<T>
where
T: ?Sized,
fn borrow_mut(&mut self) -> &mut T
impl<T> CloneToUninit for OnceCell<T>
where
T: Clone,
unsafe fn clone_to_uninit(&self, dest: *mut u8)
impl<T> From<T> for OnceCell<T>
fn from(t: T) -> TReturns the argument unchanged.
impl<T> From<never> for OnceCell<T>
fn from(t: never) -> T
impl<T> SizeHint for OnceCell<T>
where
T: ?Sized,
fn lower_bound(&self) -> usizefn upper_bound(&self) -> Option<usize>
impl<T> SizedTypeProperties for OnceCell<T>
impl<T, U> Into<U> for OnceCell<T>
where
U: From<T>,
fn into(self) -> UCalls
U::from(self).That is, this conversion is whatever the implementation of
[From]<T> for Uchooses to do.
impl<T, U> TryFrom<U> for OnceCell<T>
where
U: Into<T>,
type Error = Infallible;fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
impl<T, U> TryInto<U> for OnceCell<T>
where
U: TryFrom<T>,
type Error = <U as TryFrom<T>>::Error;fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>