1 个不稳定版本
0.1.0 | 2023年12月10日 |
---|
#836 在 过程宏
14KB
269 行
structified_enum
这个crate提供了一个属性宏structify
,将单元枚举转换为其具有区分符的结构体。
以下代码
use structified_enum::structify;
#[structify]
#[repr(u8)]
#[derive(Copy, Clone)]
enum Foo {
A = 0,
B,
C,
}
相当于
// #[repr(ty)] -> #[repr(transparent)]
#[repr(transparent)]
#[derive(Copy, Clone)]
struct Foo(u8);
impl Foo {
pub const A: Self = Self(0);
pub const B: Self = Self(1);
pub const C: Self = Self(2);
pub fn new(value: u8) -> Self {
Self(value)
}
// like `Foo::A as u8`
pub fn value(self) -> u8 {
self.0
}
}
动机
有两个主要原因
- 枚举不能直接从其区分符转换为其值。它必须通过
unsafe
或像num-derive这样的crate生成转换方法。因为结构体,如struct Foo(repr_ty)
可以自然地表达这种转换。 - 枚举的后向兼容性不好。当新版本值传递给程序(例如,通过序列化和反序列化)时,新添加的变体无法在旧版本中识别,其值将被丢弃,导致无法恢复。通过显式记录其区分符,可以在返回到新版本时保留信息,以便恢复。
依赖项
~285–740KB
~18K SLoC