2 个版本
新 0.0.2 | 2024 年 8 月 19 日 |
---|---|
0.0.1 | 2024 年 8 月 4 日 |
1656 在 Rust 模式
每月 229 次下载
16KB
319 行
struct_cache_field
struct_cache_field
提供宏,用于将方法的结果缓存到结构体字段中。
许可证
MIT 或 Apache-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