Struct OnceCell
pub struct OnceCell<T> { /* private fields */ }
A thread-safe cell that can be written to only once.
A OnceCell is typically used for global variables that need to be
initialized once on first use, but need no further changes. The OnceCell
in Tokio allows the initialization procedure to be asynchronous.
Examples
use OnceCell;
async
static ONCE: = const_new;
#
# async
It is often useful to write a wrapper method for accessing the value.
use OnceCell;
static ONCE: = const_new;
async
#
# async
Implementations
impl<T> OnceCell<T>
fn new() -> SelfCreates a new empty
OnceCellinstance.const fn const_new() -> SelfCreates a new empty
OnceCellinstance.Equivalent to
OnceCell::new, except that it can be used in static variables.When using the
tracingunstable feature, aOnceCellcreated withconst_newwill not be instrumented. As such, it will not be visible intokio-console. Instead,OnceCell::newshould be used to create an instrumented object if that is needed.Example
use OnceCell; static ONCE: = const_new; async # # asyncfn new_with(value: Option<T>) -> SelfCreates a new
OnceCellthat contains the provided value, if any.If the
OptionisNone, this is equivalent toOnceCell::new.const fn const_new_with(value: T) -> SelfCreates a new
OnceCellthat contains the provided value.Example
When using the
tracingunstable feature, aOnceCellcreated withconst_new_withwill not be instrumented. As such, it will not be visible intokio-console. Instead,OnceCell::new_withshould be used to create an instrumented object if that is needed.use OnceCell; static ONCE: = const_new_with; async # # asyncfn initialized(&self) -> boolReturns
trueif theOnceCellcurrently contains a value, andfalseotherwise.fn get(&self) -> Option<&T>Returns a reference to the value currently stored in the
OnceCell, orNoneif theOnceCellis empty.fn get_mut(&mut self) -> Option<&mut T>Returns a mutable reference to the value currently stored in the
OnceCell, orNoneif theOnceCellis empty.Since this call borrows the
OnceCellmutably, it is safe to mutate the value inside theOnceCell— the mutable borrow statically guarantees no other references exist.fn set(&self, value: T) -> Result<(), SetError<T>>Sets the value of the
OnceCellto the given value if theOnceCellis empty.If the
OnceCellalready has a value, this call will fail with anSetError::AlreadyInitializedError.If the
OnceCellis empty, but some other task is currently trying to set the value, this call will fail withSetError::InitializingError.async fn get_or_init<F, Fut>(&self, f: F) -> &T where F: FnOnce() -> Fut, Fut: Future<Output = T>,Gets the value currently in the
OnceCell, or initialize it with the given asynchronous operation.If some other task is currently working on initializing the
OnceCell, this call will wait for that other task to finish, then return the value that the other task produced.If the provided operation is cancelled or panics, the initialization attempt is cancelled. If there are other tasks waiting for the value to be initialized, one of them will start another attempt at initializing the value.
This will deadlock if
ftries to initialize the cell recursively.async fn get_or_try_init<E, F, Fut>(&self, f: F) -> Result<&T, E> where F: FnOnce() -> Fut, Fut: Future<Output = Result<T, E>>,Gets the value currently in the
OnceCell, or initialize it with the given asynchronous operation.If some other task is currently working on initializing the
OnceCell, this call will wait for that other task to finish, then return the value that the other task produced.If the provided operation returns an error, is cancelled or panics, the initialization attempt is cancelled. If there are other tasks waiting for the value to be initialized, one of them will start another attempt at initializing the value.
This will deadlock if
ftries to initialize the cell recursively.fn into_inner(self) -> Option<T>Takes the value from the cell, destroying the cell in the process. Returns
Noneif the cell is empty.fn take(&mut self) -> Option<T>Takes ownership of the current value, leaving the cell empty. Returns
Noneif the cell is empty.
Trait Implementations
impl<T> Default for OnceCell<T>
fn default() -> OnceCell<T>
impl<T> Drop for OnceCell<T>
fn drop(&mut self)
impl<T> From<T> for OnceCell<T>
fn from(value: T) -> Self
impl<T: Clone> Clone for OnceCell<T>
fn clone(&self) -> OnceCell<T>
impl<T: Debug> Debug for OnceCell<T>
fn fmt(&self, fmt: &mut Formatter<'_>) -> Result
impl<T: Eq> Eq for OnceCell<T>
impl<T: PartialEq> PartialEq for OnceCell<T>
fn eq(&self, other: &OnceCell<T>) -> bool
impl<T: Send> Send for OnceCell<T>
impl<T: Sync + Send> Sync for OnceCell<T>
Auto Trait Implementations
impl<T> !Freeze for OnceCell<T>
impl<T> !RefUnwindSafe for OnceCell<T>
impl<T> !UnwindSafe for OnceCell<T>
impl<T> Unpin for OnceCell<T>
where
UnsafeCell<MaybeUninit<T>>: Unpin,
impl<T> UnsafeUnpin for OnceCell<T>
where
UnsafeCell<MaybeUninit<T>>: UnsafeUnpin,
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> ToOwned for OnceCell<T>
where
T: Clone,
type Owned = T;fn to_owned(&self) -> Tfn clone_into(&self, target: &mut 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 = never;fn try_from(value: U) -> Result<T, never>
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>