On this page
Struct std::sync::LazyLock
pub struct LazyLock<T, F = fn() -> T> { /* private fields */ }
lazy_cell
#109736)
A value which is initialized on the first access.
This type is a thread-safe LazyCell
, and can be used in statics.
Examples
Initialize static variables with LazyLock
.
#![feature(lazy_cell)]
use std::collections::HashMap;
use std::sync::LazyLock;
static HASHMAP: LazyLock<HashMap<i32, String>> = LazyLock::new(|| {
println!("initializing");
let mut m = HashMap::new();
m.insert(13, "Spica".to_string());
m.insert(74, "Hoyten".to_string());
m
});
fn main() {
println!("ready");
std::thread::spawn(|| {
println!("{:?}", HASHMAP.get(&13));
}).join().unwrap();
println!("{:?}", HASHMAP.get(&74));
// Prints:
// ready
// initializing
// Some("Spica")
// Some("Hoyten")
}
Initialize fields with LazyLock
.
#![feature(lazy_cell)]
use std::sync::LazyLock;
#[derive(Debug)]
struct UseCellLock {
number: LazyLock<u32>,
}
fn main() {
let lock: LazyLock<u32> = LazyLock::new(|| 0u32);
let data = UseCellLock { number: lock };
println!("{}", *data.number);
}
Implementations
impl<T, F: FnOnce() -> T> LazyLock<T, F>
pub const fn new(f: F) -> LazyLock<T, F>
lazy_cell
#109736)
Creates a new lazy value with the given initializing function.
pub fn into_inner(this: Self) -> Result<T, F>
lazy_cell_consume
#109736)
Consumes this LazyLock
returning the stored value.
Returns Ok(value)
if Lazy
is initialized and Err(f)
otherwise.
Examples
#![feature(lazy_cell)]
#![feature(lazy_cell_consume)]
use std::sync::LazyLock;
let hello = "Hello, World!".to_string();
let lazy = LazyLock::new(|| hello.to_uppercase());
assert_eq!(&*lazy, "HELLO, WORLD!");
assert_eq!(LazyLock::into_inner(lazy).ok(), Some("HELLO, WORLD!".to_string()));
pub fn force(this: &LazyLock<T, F>) -> &T
lazy_cell
#109736)
Forces the evaluation of this lazy value and returns a reference to result. This is equivalent to the Deref
impl, but is explicit.
Examples
#![feature(lazy_cell)]
use std::sync::LazyLock;
let lazy = LazyLock::new(|| 92);
assert_eq!(LazyLock::force(&lazy), &92);
assert_eq!(&*lazy, &92);
Trait Implementations
impl<T: Debug, F> Debug for LazyLock<T, F>
fn fmt(&self, f: &mut Formatter<'_>) -> Result
impl<T: Default> Default for LazyLock<T>
fn default() -> LazyLock<T>
Creates a new lazy value using Default
as the initializing function.
impl<T, F: FnOnce() -> T> Deref for LazyLock<T, F>
type Target = T
fn deref(&self) -> &T
impl<T, F> Drop for LazyLock<T, F>
impl<T: RefUnwindSafe + UnwindSafe, F: UnwindSafe> RefUnwindSafe for LazyLock<T, F>
impl<T: Sync + Send, F: Send> Sync for LazyLock<T, F>
impl<T: UnwindSafe, F: UnwindSafe> UnwindSafe for LazyLock<T, F>
Auto Trait Implementations
impl<T, F> Send for LazyLock<T, F>
where
F: Send,
T: Send,
impl<T, F> Unpin for LazyLock<T, F>
where
F: Unpin,
T: Unpin,
Blanket Implementations
impl<T> Any for T
where
T: 'static + ?Sized,
impl<T> Borrow<T> for T
where
T: ?Sized,
impl<T> BorrowMut<T> for T
where
T: ?Sized,
impl<T> From<T> for T
fn from(t: T) -> T
Returns the argument unchanged.
impl<T, U> Into<U> for T
where
U: From<T>,
fn into(self) -> U
Calls U::from(self)
.
That is, this conversion is whatever the implementation of From<T> for U
chooses to do.
impl<T, U> TryFrom<U> for T
where
U: Into<T>,
type Error = Infallible
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
impl<T, U> TryInto<U> for T
where
U: TryFrom<T>,
type Error = <U as TryFrom<T>>::Error
fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>
© 2010 The Rust Project Developers
Licensed under the Apache License, Version 2.0 or the MIT license, at your option.
https://doc.rust-lang.org/std/sync/struct.LazyLock.html