#cache #proc-macro #struct-fields #field

struct_cache_field

用于缓存方法结果的进程宏

2 个版本

0.0.2 2024 年 8 月 19 日
0.0.1 2024 年 8 月 4 日

1656Rust 模式

Download history 96/week @ 2024-07-31 21/week @ 2024-08-07 112/week @ 2024-08-14

每月 229 次下载

MIT/Apache

16KB
319

struct_cache_field

struct_cache_field 提供宏,用于将方法的结果缓存到结构体字段中。

许可证

MITApache-2.0.

版权


lib.rs:

struct_cache_field

struct_cache_field 提供过程宏,用于声明/管理方法缓存字段。

用法

#[struct_cache_field::impl_cached_method]
impl Hoge {
    pub fn two_times_x(&self) -> u64 {
        2 * self.x
    }

    fn x_plus_1(&mut self) -> u64 {
        self.x = self.x + 1;
        self.x
    }
}

#[struct_cache_field::add_cache_field]
struct Hoge {
    x: u64,
}

fn main() {
    let mut hoge = Hoge {
        x: 1,
        __cache_fields__: Default::default(),
    };

    assert_eq!(hoge.two_times_x(), &2);
    assert_eq!(hoge.two_times_x(), &2);
    hoge.x = 2;
    assert_eq!(hoge.two_times_x(), &2);

    assert_eq!(hoge.x_plus_1(), &3);
    assert_eq!(hoge.x_plus_1(), &3);
    hoge.x = 3;
    assert_eq!(hoge.x_plus_1(), &3);
}

#[impl_cached_method] 生成一个结构体来持有方法的缓存。

struct __struct_cache_field__HogeCacheFields {
    two_times_x: ::core::cell::OnceCell<u64>,
    x_plus_1: ::core::cell::OnceCell<u64>,
}

#[add_cache_field] 将其添加到原始结构体定义中。

struct Hoge {
    x: u64,
    __cache_fields__: __struct_cache_field__HogeCacheFields,
}

注意,目前不支持表达式位置的过程宏。因此,您需要自己使用 ::default() 初始化 __cache_fields__

您必须同时使用 #[impl_cached_method]#[add_cache_field]。如果只使用 #[impl_cached_method],则可能在其他 crate 中导致编译错误。因为这个 crate 使用类型名键控的编译时存储。在上面的例子中,#[impl_cached_method] 使用键 "Hoge" 注册数据,而 #[add_cache_field] 消耗它。

依赖项

~1.6–9.5MB
~91K SLoC