在 Rust 中使用 Lazy_Static

https://medium.com/@coderhack.com/use-of-lazy-static-in-rust-1a239cb32cdc

Rust 中 lazy_static 的使用

lazy_static 提供方便的抽象化方式,讓開發者定義需要初始化的靜態變數,無需手動同步,並提供執行緒安全的全域狀態延遲初始化。

lazy_static crate 提供一個宏,用於在 Rust 中定義 lazy_static 變數,每個變數在首次存取時初始化,並以執行緒安全方式進行。

基本範例

可以這樣定義一個 lazy_static 變數:

#[macro_use]
extern crate lazy_static;

lazy_static! {
static ref COUNT: i32 = 0;
}

可以和一般靜態變數一樣存取此變數:

println!(“COUNT: {}”, COUNT);

首次存取 COUNT 時,會初始化為 0,之後存取時會返回初始化過的值。

在函數中使用 lazy_static

我們也可以在函數內部定義 lazy_static 變數:

fn foo() {
lazy_static! {
static ref COUNT: i32 = 0;
}
COUNT += 1;
println!(“foo 中的 COUNT: {}”, COUNT);
}

fn main() {
foo(); // 印出 1
foo(); // 印出 2
foo(); // 印出 3
}

在這裡,當 foo()第一次被呼叫時,COUNT 會被初始化,之後的呼叫中會保留遞增後的值。

使用自訂初始函數的 lazy_static

我們也可以將一個閉包傳遞給 lazy_static!用來初始化變數:

lazy_static! {
static ref NUMBERS: Vec = {
let mut nums = Vec::new();
nums.push(1);
nums.push(2);
nums
};
}

第一次存取 NUMBERS 時,會呼叫閉包進行初始化。

我們也可以使用 rand crate 來產生亂數:

extern crate rand;

use rand::Rng;

lazy_static! {
static ref RANDOM_NUMBER: i32 = {
rand::thread_rng().gen()
};
}

fn main() {
println!(“Random number: {}”, RANDOM_NUMBER);
}

via Rust on Medium

January 25, 2024 at 03:35AM

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *