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);1.94.0 · Sourcepub fn force_mut(this: &mut LazyCell<T, F>) -> &mut T
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>
impl<T, F> LazyCell<T, F>
1.94.0 · Sourcepub fn get_mut(this: &mut LazyCell<T, F>) -> Option<&mut T>
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 · Sourcepub fn get(this: &LazyCell<T, F>) -> Option<&T>
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> 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 = fn() -> T> !Sync for LazyCell<T, F>
impl<T, F> Send for LazyCell<T, F>where
UnsafeCell<State<T, F>>: Send,
impl<T, F> Unpin for LazyCell<T, F>where
UnsafeCell<State<T, F>>: Unpin,
impl<T, F> UnsafeUnpin for LazyCell<T, F>where
UnsafeCell<State<T, F>>: UnsafeUnpin,
impl<T, F> UnwindSafe for LazyCell<T, F>where
UnsafeCell<State<T, F>>: UnwindSafe,
Blanket Implementations§
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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
impl<R> CryptoRng for R
impl<T> CryptoRng for T
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> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
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 moreSource§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<R, P> ReadPrimitive<R> for P
impl<R, P> ReadPrimitive<R> for P
Source§fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
ReadEndian::read_from_little_endian().Source§impl<R> Rng for R
impl<R> Rng for R
Source§fn random<T>(&mut self) -> Twhere
StandardUniform: Distribution<T>,
fn random<T>(&mut self) -> Twhere
StandardUniform: Distribution<T>,
StandardUniform distribution. Read moreSource§fn random_iter<T>(self) -> Iter<StandardUniform, Self, T> ⓘ
fn random_iter<T>(self) -> Iter<StandardUniform, Self, T> ⓘ
Source§fn random_range<T, R>(&mut self, range: R) -> Twhere
T: SampleUniform,
R: SampleRange<T>,
fn random_range<T, R>(&mut self, range: R) -> Twhere
T: SampleUniform,
R: SampleRange<T>,
Source§fn random_bool(&mut self, p: f64) -> bool
fn random_bool(&mut self, p: f64) -> bool
p of being true. Read moreSource§fn random_ratio(&mut self, numerator: u32, denominator: u32) -> bool
fn random_ratio(&mut self, numerator: u32, denominator: u32) -> bool
numerator/denominator of being
true. Read moreSource§fn sample<T, D>(&mut self, distr: D) -> Twhere
D: Distribution<T>,
fn sample<T, D>(&mut self, distr: D) -> Twhere
D: Distribution<T>,
Source§fn sample_iter<T, D>(self, distr: D) -> Iter<D, Self, T> ⓘwhere
D: Distribution<T>,
Self: Sized,
fn sample_iter<T, D>(self, distr: D) -> Iter<D, Self, T> ⓘwhere
D: Distribution<T>,
Self: Sized,
Source§fn gen<T>(&mut self) -> Twhere
StandardUniform: Distribution<T>,
fn gen<T>(&mut self) -> Twhere
StandardUniform: Distribution<T>,
Renamed to random to avoid conflict with the new gen keyword in Rust 2024.
Rng::random.Source§fn gen_range<T, R>(&mut self, range: R) -> Twhere
T: SampleUniform,
R: SampleRange<T>,
fn gen_range<T, R>(&mut self, range: R) -> Twhere
T: SampleUniform,
R: SampleRange<T>,
Renamed to random_range
Rng::random_range.impl<R> RngCore for Rwhere
R: Rng,
Source§impl<R> RngExt for R
impl<R> RngExt for R
Source§fn random<T>(&mut self) -> Twhere
StandardUniform: Distribution<T>,
fn random<T>(&mut self) -> Twhere
StandardUniform: Distribution<T>,
StandardUniform distribution. Read moreSource§fn random_iter<T>(self) -> Iter<StandardUniform, Self, T> ⓘ
fn random_iter<T>(self) -> Iter<StandardUniform, Self, T> ⓘ
Source§fn random_range<T, R>(&mut self, range: R) -> Twhere
T: SampleUniform,
R: SampleRange<T>,
fn random_range<T, R>(&mut self, range: R) -> Twhere
T: SampleUniform,
R: SampleRange<T>,
Source§fn random_bool(&mut self, p: f64) -> bool
fn random_bool(&mut self, p: f64) -> bool
p of being true. Read moreSource§fn random_ratio(&mut self, numerator: u32, denominator: u32) -> bool
fn random_ratio(&mut self, numerator: u32, denominator: u32) -> bool
numerator/denominator of being
true. Read moreSource§fn sample<T, D>(&mut self, distr: D) -> Twhere
D: Distribution<T>,
fn sample<T, D>(&mut self, distr: D) -> Twhere
D: Distribution<T>,
Source§fn sample_iter<T, D>(self, distr: D) -> Iter<D, Self, T> ⓘwhere
D: Distribution<T>,
Self: Sized,
fn sample_iter<T, D>(self, distr: D) -> Iter<D, Self, T> ⓘwhere
D: Distribution<T>,
Self: Sized,
impl<R> TryCryptoRng for R
impl<R> TryCryptoRng for R
Source§impl<R> TryRng for R
impl<R> TryRng for R
Source§impl<R> TryRngCore for Rwhere
R: TryRng,
impl<R> TryRngCore for Rwhere
R: TryRng,
Source§impl<R> TryRngCore for R
impl<R> TryRngCore for R
Source§fn try_next_u32(&mut self) -> Result<u32, <R as TryRngCore>::Error>
fn try_next_u32(&mut self) -> Result<u32, <R as TryRngCore>::Error>
u32.Source§fn try_next_u64(&mut self) -> Result<u64, <R as TryRngCore>::Error>
fn try_next_u64(&mut self) -> Result<u64, <R as TryRngCore>::Error>
u64.Source§fn try_fill_bytes(
&mut self,
dst: &mut [u8],
) -> Result<(), <R as TryRngCore>::Error>
fn try_fill_bytes( &mut self, dst: &mut [u8], ) -> Result<(), <R as TryRngCore>::Error>
dest entirely with random data.Source§fn unwrap_mut(&mut self) -> UnwrapMut<'_, Self>
fn unwrap_mut(&mut self) -> UnwrapMut<'_, Self>
UnwrapMut wrapper.Source§fn read_adapter(&mut self) -> RngReadAdapter<'_, Self> ⓘwhere
Self: Sized,
fn read_adapter(&mut self) -> RngReadAdapter<'_, Self> ⓘwhere
Self: Sized,
RngCore to a RngReadAdapter.