pub struct LazyCell<T, F = fn() -> T> { /* private fields */ }Expand description
A value which is initialized on the first access.
For a thread-safe version of this struct, see std::sync::LazyLock.
§Poisoning
If the initialization closure passed to LazyCell::new panics, the cell will be poisoned.
Once the cell is poisoned, any threads that attempt to access this cell (via a dereference
or via an explicit call to force()) will panic.
This concept is similar to that of poisoning in the std::sync::poison module. A key
difference, however, is that poisoning in LazyCell is unrecoverable. All future accesses of
the cell from other threads will panic, whereas a type in std::sync::poison like
std::sync::poison::Mutex allows recovery via PoisonError::into_inner().
§Examples
use std::cell::LazyCell;
let lazy: LazyCell<i32> = LazyCell::new(|| {
println!("initializing");
92
});
println!("ready");
println!("{}", *lazy);
println!("{}", *lazy);
// Prints:
// ready
// initializing
// 92
// 92Implementations§
Source§impl<T, F> LazyCell<T, F>where
F: FnOnce() -> T,
impl<T, F> LazyCell<T, F>where
F: FnOnce() -> T,
1.80.0 (const: 1.80.0) · Sourcepub const fn new(f: F) -> LazyCell<T, F>
pub const fn new(f: F) -> LazyCell<T, F>
Creates a new lazy value with the given initializing function.
§Examples
use std::cell::LazyCell;
let hello = "Hello, World!".to_string();
let lazy = LazyCell::new(|| hello.to_uppercase());
assert_eq!(&*lazy, "HELLO, WORLD!");Sourcepub const fn into_inner(this: LazyCell<T, F>) -> Result<T, F>
🔬This is a nightly-only experimental API. (lazy_cell_into_inner)
pub const fn into_inner(this: LazyCell<T, F>) -> Result<T, F>
lazy_cell_into_inner)Consumes this LazyCell returning the stored value.
Returns Ok(value) if Lazy is initialized and Err(f) otherwise.
§Panics
Panics if the cell is poisoned.
§Examples
#![feature(lazy_cell_into_inner)]
use std::cell::LazyCell;
let hello = "Hello, World!".to_string();
let lazy = LazyCell::new(|| hello.to_uppercase());
assert_eq!(&*lazy, "HELLO, WORLD!");
assert_eq!(LazyCell::into_inner(lazy).ok(), Some("HELLO, WORLD!".to_string()));1.80.0 · Sourcepub fn force(this: &LazyCell<T, F>) -> &T
pub fn force(this: &LazyCell<T, F>) -> &T
Forces the evaluation of this lazy value and returns a reference to the result.
This is equivalent to the Deref impl, but is explicit.
§Panics
If the initialization closure panics (the one that is passed to the new() method), the
panic is propagated to the caller, and the cell becomes poisoned. This will cause all future
accesses of the cell (via force() or a dereference) to panic.
§Examples
use std::cell::LazyCell;
let lazy = LazyCell::new(|| 92);
assert_eq!(LazyCell::force(&lazy), &92);
assert_eq!(&*lazy, &92);Sourcepub fn force_mut(this: &mut LazyCell<T, F>) -> &mut T
🔬This is a nightly-only experimental API. (lazy_get)
pub fn force_mut(this: &mut LazyCell<T, F>) -> &mut T
lazy_get)Forces the evaluation of this lazy value and returns a mutable reference to the result.
§Panics
If the initialization closure panics (the one that is passed to the new() method), the
panic is propagated to the caller, and the cell becomes poisoned. This will cause all future
accesses of the cell (via force() or a dereference) to panic.
§Examples
#![feature(lazy_get)]
use std::cell::LazyCell;
let mut lazy = LazyCell::new(|| 92);
let p = LazyCell::force_mut(&mut lazy);
assert_eq!(*p, 92);
*p = 44;
assert_eq!(*lazy, 44);Source§impl<T, F> LazyCell<T, F>
impl<T, F> LazyCell<T, F>
Sourcepub fn get_mut(this: &mut LazyCell<T, F>) -> Option<&mut T>
🔬This is a nightly-only experimental API. (lazy_get)
pub fn get_mut(this: &mut LazyCell<T, F>) -> Option<&mut T>
lazy_get)Returns a mutable reference to the value if initialized. Otherwise (if uninitialized or
poisoned), returns None.
§Examples
#![feature(lazy_get)]
use std::cell::LazyCell;
let mut lazy = LazyCell::new(|| 92);
assert_eq!(LazyCell::get_mut(&mut lazy), None);
let _ = LazyCell::force(&lazy);
*LazyCell::get_mut(&mut lazy).unwrap() = 44;
assert_eq!(*lazy, 44);Sourcepub fn get(this: &LazyCell<T, F>) -> Option<&T>
🔬This is a nightly-only experimental API. (lazy_get)
pub fn get(this: &LazyCell<T, F>) -> Option<&T>
lazy_get)Returns a reference to the value if initialized. Otherwise (if uninitialized or poisoned),
returns None.
§Examples
#![feature(lazy_get)]
use std::cell::LazyCell;
let lazy = LazyCell::new(|| 92);
assert_eq!(LazyCell::get(&lazy), None);
let _ = LazyCell::force(&lazy);
assert_eq!(LazyCell::get(&lazy), Some(&92));Trait Implementations§
1.80.0 · Source§impl<T, F> Deref for LazyCell<T, F>where
F: FnOnce() -> T,
impl<T, F> Deref for LazyCell<T, F>where
F: FnOnce() -> T,
Auto Trait Implementations§
impl<T, F = fn() -> T> !Freeze for LazyCell<T, F>
impl<T, F = fn() -> T> !RefUnwindSafe for LazyCell<T, F>
impl<T, F> Send for LazyCell<T, F>
impl<T, F = fn() -> T> !Sync for LazyCell<T, F>
impl<T, F> Unpin for LazyCell<T, F>
impl<T, F> UnwindSafe for LazyCell<T, F>where
F: UnwindSafe,
T: UnwindSafe,
Blanket Implementations§
Source§impl<S> AssignWithType for S
impl<S> AssignWithType for S
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<C, E> EntryToVal<C> for Ewhere
C: Collection<Entry = E>,
impl<C, E> EntryToVal<C> for Ewhere
C: Collection<Entry = E>,
Source§type Val = <C as Collection>::Val
type Val = <C as Collection>::Val
Entry in complex collections.
For example, in a HashMap, while Entry might be a ( key, value ) tuple, Val might only be the value part.Source§fn entry_to_val(self) -> <E as EntryToVal<C>>::Val
fn entry_to_val(self) -> <E as EntryToVal<C>>::Val
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
Source§impl<'a, T> ToStringWith<WithDebug> for T
impl<'a, T> ToStringWith<WithDebug> for T
Source§fn to_string_with<'s>(&'s self) -> Cow<'s, str>
fn to_string_with<'s>(&'s self) -> Cow<'s, str>
Converts the type to a string using Debug formatting.
Source§impl<'a, T> ToStringWith<WithDebugMultiline> for T
impl<'a, T> ToStringWith<WithDebugMultiline> for T
Source§fn to_string_with<'s>(&'s self) -> Cow<'s, str>
fn to_string_with<'s>(&'s self) -> Cow<'s, str>
Converts the type to a string using Debug formatting.
Source§impl<Initial, Error, Final> TransitiveTryFrom<Error, Initial> for Final
impl<Initial, Error, Final> TransitiveTryFrom<Error, Initial> for Final
Source§impl<Error, Final, Initial> TransitiveTryInto<Error, Final> for Initial
impl<Error, Final, Initial> TransitiveTryInto<Error, Final> for Initial
Source§impl<C, Val> ValToEntry<C> for Valwhere
C: CollectionValToEntry<Val>,
impl<C, Val> ValToEntry<C> for Valwhere
C: CollectionValToEntry<Val>,
Source§fn val_to_entry(self) -> <C as CollectionValToEntry<Val>>::Entry
fn val_to_entry(self) -> <C as CollectionValToEntry<Val>>::Entry
Invokes the val_to_entry function of the CollectionValToEntry trait to convert the value to an entry.