#枚举 #过程宏 #模板

structified_enum

将单元枚举(unit-like enum)结构化的宏

1 个不稳定版本

0.1.0 2023年12月10日

#836过程宏

MIT 许可证

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
    }
}

动机

有两个主要原因

  1. 枚举不能直接从其区分符转换为其值。它必须通过unsafe或像num-derive这样的crate生成转换方法。因为结构体,如struct Foo(repr_ty)可以自然地表达这种转换。
  2. 枚举的后向兼容性不好。当新版本值传递给程序(例如,通过序列化和反序列化)时,新添加的变体无法在旧版本中识别,其值将被丢弃,导致无法恢复。通过显式记录其区分符,可以在返回到新版本时保留信息,以便恢复。

依赖项

~285–740KB
~18K SLoC