#struct-fields #reuse #macro #inheritance #dry

reusable

组合结构体字段 - 在其他结构体中复用结构体字段

1 个不稳定版本

0.1.0 2023年1月14日

#10#dry

Download history 22/week @ 2024-04-05 9/week @ 2024-04-12 7/week @ 2024-04-19 4/week @ 2024-04-26 3/week @ 2024-05-10 12/week @ 2024-05-17 15/week @ 2024-05-24 11/week @ 2024-05-31 12/week @ 2024-06-07 4/week @ 2024-06-14 159/week @ 2024-06-21 203/week @ 2024-06-28 140/week @ 2024-07-05 227/week @ 2024-07-12 200/week @ 2024-07-19

832 每月下载次数

MIT/Apache

7KB

复用 - 组合结构体字段

通过在宏之间存储结构体的来源,在代码中跨多个结构体复用结构体字段的一个示例。

用法

  1. 将此宏添加到您的项目中

  2. #[reusable(name)] 属性添加到您想要复用的结构体中,其中 name 是结构体的全局唯一标识符(最好使用 crate 和模块名称进行命名空间)

  3. #[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);
}

工作原理

  1. 此 crate 严重依赖于 macro_state 来在宏调用之间共享数据。

  2. reusable 属性使用提供的名称作为键,将结构体的 tokenstream 复制到全局状态中

  3. reuse 属性读取由 reusable 设置的 tokenstream,解析匹配给定名称的结构体,然后将字段追加到生成的结构体中(具有相同名称的字段将被跳过,因此可以被覆盖)

注意:可以向 reuse 属性提供多个名称,例如 #[reuse(name1, name2)]

在稳定 Rust 中工作,无需 nightly。

替代方案

其他 crate 可以提供类似的功能,例如

born - 从内联结构体定义生成宏,从而生成新的结构体

依赖项

~1.5MB
~36K SLoC