1 个不稳定版本
0.1.0 | 2023年1月14日 |
---|
#10 在 #dry
832 每月下载次数
7KB
复用 - 组合结构体字段
通过在宏之间存储结构体的来源,在代码中跨多个结构体复用结构体字段的一个示例。
用法
-
将此宏添加到您的项目中
-
将
#[reusable(name)]
属性添加到您想要复用的结构体中,其中 name 是结构体的全局唯一标识符(最好使用 crate 和模块名称进行命名空间) -
将
#[reuse(name)]
属性添加到您想要复用的结构体中,使用与上述属性中相同的名称
示例
use reusable::{reusable, reuse};
#[reusable(test_name)]
#[derive(Debug)]
struct Name {
firstname: String,
surname: String,
}
#[reuse(test_name)]
#[derive(Debug)]
struct Fullname {
middlename: String,
}
fn main() {
let example = Fullname {
firstname: "Bob".to_string(),
middlename: "Frank".to_string(),
surname: "Junior".to_string(),
};
dbg!(example);
}
工作原理
-
此 crate 严重依赖于 macro_state 来在宏调用之间共享数据。
-
reusable
属性使用提供的名称作为键,将结构体的 tokenstream 复制到全局状态中 -
reuse
属性读取由reusable
设置的 tokenstream,解析匹配给定名称的结构体,然后将字段追加到生成的结构体中(具有相同名称的字段将被跳过,因此可以被覆盖)
注意:可以向 reuse
属性提供多个名称,例如 #[reuse(name1, name2)]
。
在稳定 Rust 中工作,无需 nightly。
替代方案
其他 crate 可以提供类似的功能,例如
born - 从内联结构体定义生成宏,从而生成新的结构体
依赖项
~1.5MB
~36K SLoC