#枚举 #差异 #映射 #转换 #过程宏 # #整数

无差别映射

用于在值和枚举差异之间进行映射的过程宏

2 个不稳定版本

0.2.0 2022年9月22日
0.1.0 2022年9月11日

#1574算法


3 crates 中使用

MIT 许可证

5KB

无差别映射

可以使用指定自定义差异创建普通 rust 枚举

enum MyEnum {
    A = 1,
    B = 2
}

甚至可以指定特定的整数类型作为底层类型

#[repr(u8)]
enum MyByteEnum {
    A = 1,
    B = 2
}

然而,整数和枚举之间的转换可能会很繁琐,并且如果枚举情况没有完全覆盖,可能会导致错误。即使是 u8 枚举,覆盖 256 种可能性也是不可行的。

为了解决这个问题,您可以将 indiscriminant 属性应用于枚举

#[indiscriminant_bits(u8, 1)]
enum MyDiscriminantEnum {
    A = 0,
    B = 1
}

其中第一个参数是底层整数类型,第二个参数是解释为枚举的底层整数的最低有效位。

您还可以指定在将整数转换为枚举时,整数是否应该为零除了枚举字段

#[indiscriminant_bits(u8, 1)]
enum MyDiscriminantEnum {
    A = 0,
    B = 1
}

您不需要指定您指定的枚举的每个可能值,但如果不是这样,则需要添加一个无值字段,名为 Default

#[indiscriminant_bits(u8, 2)]
enum MyDiscriminantEnum {
    A = 0,
    B = 1,
    Default
}

如果默认情况将存在,则默认选项必须是最后一个。indiscriminant 属性还为每个应用的枚举提供了两个函数

let a: u8 = MyDiscriminantEnum::A.to_int();
let b: MyDiscriminantEnum = MyDiscriminantEnum::from_int(a);

这些函数保证成功,因此当枚举定义时,需要在必要时对 Default 字段提出要求。

依赖关系

~1.5MB
~36K SLoC