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
.
§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,
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 fn into_inner(this: LazyCell<T, F>) -> Result<T, F>
🔬This is a nightly-only experimental API. (lazy_cell_into_inner
)
pub 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.
§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.
§Examples
use std::cell::LazyCell;
let lazy = LazyCell::new(|| 92);
assert_eq!(LazyCell::force(&lazy), &92);
assert_eq!(&*lazy, &92);
Trait Implementations§
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<T> Also for T
impl<T> Also for T
source§impl<T, Res> Apply<Res> for Twhere
T: ?Sized,
impl<T, Res> Apply<Res> for Twhere
T: ?Sized,
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
Mutably borrows from an owned value. Read more
source§impl<T> ByteSized for T
impl<T> ByteSized for T
source§const BYTE_ALIGN: usize = _
const BYTE_ALIGN: usize = _
The alignment of this type in bytes.
source§const LITTLE_ENDIAN: bool = true
const LITTLE_ENDIAN: bool = true
True if the system’s architecture is little-endian.
source§const BIG_ENDIAN: bool = false
const BIG_ENDIAN: bool = false
True if the system’s architecture is big-endian.
source§fn byte_align(&self) -> usize ⓘ
fn byte_align(&self) -> usize ⓘ
Returns the alignment of this type in bytes.
source§impl<T> ExtAny for T
impl<T> ExtAny for T
source§fn as_any_mut(&mut self) -> &mut dyn Anywhere
Self: Sized,
fn as_any_mut(&mut self) -> &mut dyn Anywhere
Self: Sized,
source§impl<T> ExtMem for Twhere
T: ?Sized,
impl<T> ExtMem for Twhere
T: ?Sized,
source§const NEEDS_DROP: bool = _
const NEEDS_DROP: bool = _
Know whether dropping values of this type matters, in compile-time.
source§fn mem_needs_drop(&self) -> bool
fn mem_needs_drop(&self) -> bool
Returns
true
if dropping values of this type matters. Read moresource§fn mem_forget(self)where
Self: Sized,
fn mem_forget(self)where
Self: Sized,
Forgets about
self
without running its destructor. Read moresource§fn mem_replace(&mut self, other: Self) -> Selfwhere
Self: Sized,
fn mem_replace(&mut self, other: Self) -> Selfwhere
Self: Sized,
source§fn mem_as_bytes(&self) -> &[u8] ⓘ
fn mem_as_bytes(&self) -> &[u8] ⓘ
Available on crate feature
unsafe_slice
only.