3个不稳定版本
0.2.0 | 2022年1月4日 |
---|---|
0.1.1 | 2021年1月11日 |
0.1.0 | 2021年1月8日 |
在 进程宏 中排名 1896
每月下载量 39,399
用于 2 crates
11KB
202 行
field_names
field_names
是一个Rust crate,它可以在运行时将字段或变体名称作为字符串暴露出来。
示例
考虑一个简单的结构体,例如以下这个。
#[derive(FieldNames)]
struct Example {
hello: String,
world: String,
#[field_names(skip)]
ignore_me: bool,
}
field_names
将发出以下内容
#[automatically_derived]
impl Example {
const FIELDS: [&'static str; 2] = [
"hello",
"world",
];
}
枚举相同
#[derive(VariantNames)]
enum Example {
Hello(String),
#[variant_names(skip)]
Secret(String),
World,
}
field_names
将发出以下内容
#[automatically_derived]
impl Example {
const VARIANTS: [&'static str; 2] = [
"Hello",
"World",
];
}
用途
此crate最初是为一个场景创建的,该场景在运行时读取一组规则,这些规则引用了代码库中其他地方结构体的字段。引用的结构体公开了一个方法,该方法包含一个 match
语句,用于从字符串到其字段的转换,但没有方法可以确保该match语句的分支与结构体定义保持同步。使用此crate,可以创建一个单元测试,以确保结构体上的每个字段(除了故意省略的字段)都由该方法处理。
此crate还可以在单元测试时间强制执行结构体和枚举之间的关系,这些关系在编译时无法表达。请参阅 tests/keep_in_sync
以获取示例和该场景的解释。
常见问题解答
为什么 FieldNames
和 VariantNames
不是特质?
使用 field_names
是一种实现便利;它不应该强迫您更改crate的公共API。
我如何使 FIELDS
或 VARIANTS
公开?
您可以为您的程序添加自己的固有方法,例如:fields() -> &[&'static str]
,或者定义一个符合您需求的特质,并在特质实现中引用FIELDS
。
我能否为枚举变体获取字段名称?
目前不支持此功能,目前推荐使用newtype变体和每个变体对应的单独结构体。您可以使用from_variants
crate来自动生成从这些结构体到枚举的转换。
依赖关系
~2MB
~43K SLoC