5个版本

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

177#lazy-evaluation 中排名

每月下载 28
用于 lazy-attribute

MIT/Apache

10KB
86

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
~57K SLoC