2 个不稳定版本
使用旧的 Rust 2015
0.2.0 | 2022 年 12 月 31 日 |
---|---|
0.1.0 | 2022 年 12 月 30 日 |
#1764 in Rust 模式
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,
}
虽然区别不大,但使用宏的声明更加简洁,更加简洁,最重要的是更少重复。