#structs #macro #definition #derive #concise #declare #visibility

similar-structs-macros

为更简洁的 struct/enum 定义提供生活化宏

2 个不稳定版本

使用旧的 Rust 2015

0.2.0 2022 年 12 月 31 日
0.1.0 2022 年 12 月 30 日

#1764 in Rust 模式

MIT/Apache

10KB
120

similar_structs_macros

此crate提供两个声明式宏,以帮助在定义共享某些特性、属性或可见性的structs和enums时避免重复。similar_structs!宏允许您一次性声明多个structs,并指定所有structs、字段或两者都应该是默认公开的。它还可以指定所有structs应默认推导某些特性或属性。similar_enums!宏的功能类似,但用于enums而不是structs。

使用方法

要使用similar_structs声明structs,只需在similar_structs!{}内声明一个struct,就像您通常所做的那样,但省略“struct”关键字(您必须使用字段后的逗号,否则将得到一个令人费解的错误消息!)

use similar_structs_macros::similar_structs;

similar_structs!{
    pub User {
        pub credentials: UserCredentials,
    }
    pub UserCredentials {
        pub username: String,
        pub password: String,
    }
}

请注意,单独声明structs和字段为公开是完全有效的。然而,您可以指定所有structs、字段或两者都应该是默认公开的,如下面的示例所示,它们将产生相同的结果

similar_structs!{
    pub structs;

    User {
        pub credentials: UserCredentials,
    }
    UserCredentials {
        pub username: String,
        pub password: String,
    }
}
similar_structs!{
    pub fields;

    pub User {
        credentials: UserCredentials,
    }
    pub UserCredentials {
        username: String,
        password: String,
    }
}
similar_structs!{
    pub all;
    
    User {
        credentials: UserCredentials,
    }
    UserCredentials {
        username: String,
        password: String,
    }
}

说明默认可见性的行必须出现在任何struct定义之前,并且必须以分号结尾。

您还可以使用“repeat #[derive(...)];”行指定所有structs应默认推导某些特性或属性。

similar_structs!{
    repeat #[derive(Debug, Clone)];
    pub all;
    
    User {
        credentials: UserCredentials,
    }
    UserCredentials {
        username: String,
        password: String,
    }
}

这将复制每个struct定义中的#[derive(Debug, Clone)]行。这也应该适用于在structs之间共享属性,尽管这尚未经过测试。每个宏只能有一个重复行,并且它必须以分号结尾。重复行可以在默认可见性行之前或之后,只要它们都出现在任何struct定义之前。similar_enums!宏与similar_structs!类似,但用于enums而不是structs,并且只可以选择指定所有enums都应该是默认公开的

use similar_structs_macros::similar_enums;

similar_enums!{
    pub enums;
    repeat #[derive(Clone, Debug)];

    State {
        Alive(usize),
        Dead {
            is_buried: bool,
            is_cremated: bool,
        },
    }
    Color {
        Blue,
        Grey,
        Black,
    }
}

以下是一个宏展开的示例

上面的similar_structs!示例展开为

#[derive(Debug, Clone)]
pub struct User {
    pub credentials: UserCredentials,
}
#[derive(Debug, Clone)]
pub struct UserCredentials {
    pub username: String,
    pub password: String,
}

上面的similar_enums!示例展开为

#[derive(Clone, Debug)]
pub enum State {
    Alive(usize),
    Dead {
        is_buried: bool,
        is_cremated: bool,
    }
}
#[derive(Clone, Debug)]
pub enum Color {
    Blue,
    Grey,
    Black,
}

虽然区别不大,但使用宏的声明更加简洁,更加简洁,最重要的是更少重复。

无运行时依赖