1 个不稳定版本
0.1.0 | 2021年6月5日 |
---|
#1950 在 过程宏
7KB
71 行
box_shorthand
我喜欢编写大量基于枚举的树类型,并深入测试它们的嵌套层次结构。编写这些测试很繁琐,因为必须显式地box嵌套值。此crate添加了一个名为box_shorthand
的derive宏。它生成一个包含用于创建枚举类型boxed值的函数的模块。
给定以下类型声明
#[derive(box_shorthand)]
enum Enum {
Unit,
Tuple(i64, i64)
Struct {
x: i64,
y: i64,
}
}
以下代码将被生成
mod EnumBox {
use super::*;
fn Unit() -> Box<Enum> {
Box::new(Enum::Unit)
}
fn Tuple(field0: i64, field1: i64) -> Box<Enum> {
Box::new(Enum::Tuple(field0, field1))
}
fn Struct(x: i64, y: i64) -> Box<Enum> {
Box::new(Enum::Struct { x, y })
}
}
请参见集成测试在/tests
。
用法
只需调用生成的函数来直接构建boxed变体值。如果您想要更短的缩写,只需use EnumBox::*
以直接访问函数!
请注意,单元变体的缩写使用括号调用,因为它们仅仅是函数。同样适用于结构变体缩写。
此宏应能与泛型参数和where子句正常工作。
请注意,此宏将在非枚举类型上失败。
关于问题#50504的说明
编译器抱怨导入模块的类型不应该可见,并且将来会中断。但这似乎并不正确,因为我们有在生成的每个模块顶部都有use super::*;
。因此我们抑制了这个警告。
未来
我可能将此扩展到为结构体生成new_boxed
函数。将此泛化到联合体也可能是个好主意。欢迎提出建议,但我不能保证我会查看或回复。
依赖关系
~1.5MB
~35K SLoC