#lazy-evaluation #attributes #execution #macro #function #called #cache

lazy-attribute

此软件包提供了一个方便的属性宏,用于懒加载函数执行

4 个版本

0.1.4 2023 年 11 月 2 日
0.1.3 2023 年 11 月 2 日
0.1.2 2023 年 11 月 2 日
0.1.1 2023 年 10 月 30 日

#1696 in Rust 模式

MIT/Apache

8KB

lazy-attribute

Crate Code Coverage Build Status License-Apache License-MIT Docs

lazy-attributes 提供了简化使用懒加载函数的属性宏。

使用 #[lazy_ref] 装饰的函数将在第一次调用时执行。在后续调用中,将返回缓存的返回值。

用法

使用 lazy_attribute::lazy_ref,您可以注释一个希望懒加载评估的函数

use lazy_attribute::lazy_ref;

#[lazy_ref]
fn get_string() -> String {
    println!("Called once!");
    String::from("Hello, world!")
}

fn main() {
    println!("{}", get_string());  // Outputs: Called once! Hello, world!
    println!("{}", get_string());  // Outputs: Hello, world!
}

函数第一次被调用时,它将被评估,并将结果缓存。后续调用将返回缓存的值。

lazy_ref 宏大致将 get_string 函数转换为

static __lazy_static_get_string: OnceCell<String> = OnceCell::new();

fn get_string() -> &'static String {
    __lazy_static_get_string.get_or_init(|| {
        println!("Called once!");
        String::from("Hello, world!")
    })
}

启用 async 功能后,lazy_ref 也可以与异步函数一起使用

use lazy_attribute::lazy_ref;

#[lazy_ref]
async fn get_string() -> String {
    println!("Called once!");
    String::from("Hello, world!")
}

#[tokio::main]
async fn main() {
    println!("{}", get_string().await);  // Outputs: Called once! Hello, world!
    println!("{}", get_string().await);  // Outputs: Hello, world!
}

注意事项

  • lazy_* 宏不支持带参数的函数。您将收到一个错误,指出不支持参数。

软件包功能

  • async - 启用对懒加载异步函数的支持。

依赖关系

~3MB
~58K SLoC