Skip to main content

LazyCell

Struct LazyCell 

1.80.0 · Source
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
//   92

Implementations§

Source§

impl<T, F> LazyCell<T, F>
where F: FnOnce() -> T,

1.80.0 (const: 1.80.0) · Source

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!");
Source

pub const fn into_inner(this: LazyCell<T, F>) -> Result<T, F>

🔬This is a nightly-only experimental API. (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 · Source

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);
1.94.0 · Source

pub fn force_mut(this: &mut LazyCell<T, F>) -> &mut T

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
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>

1.94.0 · Source

pub fn get_mut(this: &mut LazyCell<T, F>) -> Option<&mut T>

Returns a mutable reference to the value if initialized. Otherwise (if uninitialized or poisoned), returns None.

§Examples
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);
1.94.0 · Source

pub fn get(this: &LazyCell<T, F>) -> Option<&T>

Returns a reference to the value if initialized. Otherwise (if uninitialized or poisoned), returns None.

§Examples
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> Debug for LazyCell<T, F>
where T: Debug,

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
1.80.0 · Source§

impl<T> Default for LazyCell<T>
where T: Default,

Source§

fn default() -> LazyCell<T>

Creates a new lazy value using Default as the initializing function.

1.80.0 · Source§

impl<T, F> Deref for LazyCell<T, F>
where F: FnOnce() -> T,

Source§

fn deref(&self) -> &T

§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.

Source§

type Target = T

The resulting type after dereferencing.
1.89.0 · Source§

impl<T, F> DerefMut for LazyCell<T, F>
where F: FnOnce() -> T,

Source§

fn deref_mut(&mut self) -> &mut T

§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.

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>
where F: Send, T: Send,

§

impl<T, F = fn() -> T> !Sync for LazyCell<T, F>

§

impl<T, F> Unpin for LazyCell<T, F>
where F: Unpin, T: Unpin,

§

impl<T, F> UnsafeUnpin for LazyCell<T, F>
where F: UnsafeUnpin, T: UnsafeUnpin,

§

impl<T, F> UnwindSafe for LazyCell<T, F>
where F: UnwindSafe, T: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CheckedConversion for T

Source§

fn checked_from<T>(t: T) -> Option<Self>
where Self: TryFrom<T>,

Convert from a value of T into an equivalent instance of Option<Self>. Read more
Source§

fn checked_into<T>(self) -> Option<T>
where Self: TryInto<T>,

Consume self to return Some equivalent value of Option<T>. Read more
Source§

impl<T, U> DefensiveTruncateInto<U> for T

Source§

fn defensive_truncate_into(self) -> U

Defensively truncate a value and convert it into its bounded form.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T, U> IntoKey<U> for T
where U: FromKey<T>,

Source§

fn into_key(self) -> U

Source§

impl<Src, Dest> IntoTuple<Dest> for Src
where Dest: FromTuple<Src>,

Source§

fn into_tuple(self) -> Dest

Source§

impl<T> IsType<T> for T

Source§

fn from_ref(t: &T) -> &T

Cast reference.
Source§

fn into_ref(&self) -> &T

Cast reference.
Source§

fn from_mut(t: &mut T) -> &mut T

Cast mutable reference.
Source§

fn into_mut(&mut self) -> &mut T

Cast mutable reference.
Source§

impl<T, Outer> IsWrappedBy<Outer> for T
where Outer: AsRef<T> + AsMut<T> + From<T>, T: From<Outer>,

Source§

fn from_ref(outer: &Outer) -> &T

Get a reference to the inner from the outer.

Source§

fn from_mut(outer: &mut Outer) -> &mut T

Get a mutable reference to the inner from the outer.

Source§

impl<P, T> Receiver for P
where P: Deref<Target = T> + ?Sized, T: ?Sized,

Source§

type Target = T

🔬This is a nightly-only experimental API. (arbitrary_self_types)
The target type on which the method may be called.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> SaturatedConversion for T

Source§

fn saturated_from<T>(t: T) -> Self
where Self: UniqueSaturatedFrom<T>,

Convert from a value of T into an equivalent instance of Self. Read more
Source§

fn saturated_into<T>(self) -> T
where Self: UniqueSaturatedInto<T>,

Consume self to return an equivalent value of T. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T, U> TryIntoKey<U> for T
where U: TryFromKey<T>,

Source§

type Error = <U as TryFromKey<T>>::Error

Source§

fn try_into_key(self) -> Result<U, <U as TryFromKey<T>>::Error>

Source§

impl<S, T> UncheckedInto<T> for S
where T: UncheckedFrom<S>,

Source§

fn unchecked_into(self) -> T

The counterpart to unchecked_from.
Source§

impl<T, S> UniqueSaturatedInto<T> for S
where T: Bounded, S: TryInto<T>,

Source§

fn unique_saturated_into(self) -> T

Consume self to return an equivalent value of T.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<T> Formattable for T
where T: Deref, <T as Deref>::Target: Formattable,

Source§

impl<T> JsonSchemaMaybe for T

Source§

impl<T> MaybeDebug for T
where T: Debug,