lazy-attribute

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

`lazy-attributes` provides attribute macros for simplifying working with lazily evaluated functions. Functions decorated with `#[lazy_ref]` will only be executed the first time they are called. On subsequent calls, the cached return value is returned. ## Usage With [`lazy_attribute::lazy_ref`][crate::lazy_ref], you can annotate a function that you want to lazily evaluate: ```rust 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! } ``` The first time the function is called, it will be evaluated and its result will be cached. Subsequent calls will return the cached result. `lazy_ref` macro roughly desugars the `get_string` function to: ```ignore static __lazy_static_get_string: OnceCell = OnceCell::new(); fn get_string() -> &'static String { __lazy_static_get_string.get_or_init(|| { println!("Called once!"); String::from("Hello, world!") }) } ``` With `async` feature enabled, `lazy_ref` can also be used with async functions: ```rust 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! } ``` ## Caveats - `lazy_*` macros do not support functions with arguments. You will get an error telling you arguments are not supported. ## Crate Features - `async` - Enables support for lazily evaluating async functions. [crate::lazy_ref]: https://docs.rs/lazy-attribute/latest/lazy_attribute/attr.lazy_ref.html