#枚举 # #boxed #缩写 #变体 #函数 #box

box_shorthand

Rust derive宏,用于创建初始化boxed枚举变体值的缩写函数

1 个不稳定版本

0.1.0 2021年6月5日

#1950过程宏

MIT 许可证

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