2 个版本
0.1.2 | 2021 年 10 月 7 日 |
---|---|
0.1.1 | 2021 年 10 月 1 日 |
0.1.0 |
|
#22 在 #u8
6KB
zhi_enum
轻松创建具有未知字段支持的类型转换特性。
用法
- 将
EnumConvert
或EnumTryConvert
添加到derive
属性中。
use zhi_enum::{EnumConvert, EnumTryConvert};
#[derive(Debug, Ord, PartialOrd, Eq, PartialEq, EnumConvert)]
#[repr(u8)]
enum NumberConvert {
Zero,
One,
Two,
Three,
Four,
Ten = 10,
Eleven,
Twenty = 10 + 10,
TwentyOne,
#[zhi_enum(unknown)]
Unknown(u8),
}
#[derive(Debug, Ord, PartialOrd, Eq, PartialEq, EnumTryConvert)]
#[repr(u8)]
enum NumberTryConvert {
Zero,
One,
Two,
Three,
Four,
Ten = 10,
Eleven,
Twenty = 10 + 10,
TwentyOne,
#[zhi_enum(unknown)]
Unknown(u8),
}
- 然后,您可以使用
.from
/.into
转换函数
assert_eq!(NumberConvert::Three.into_u8(), 3u8);
assert_eq!(NumberTryConvert::Three.try_into_u8().unwrap(), 3u8);
assert_eq!(NumberConvert::Ten.into_u8(), 10u8);
assert_eq!(NumberTryConvert::Ten.try_into_u8().unwrap(), 10u8);
assert_eq!(NumberConvert::Eleven.into_u8(), 11u8);
assert_eq!(NumberTryConvert::Eleven.try_into_u8().unwrap(), 11u8);
assert_eq!(NumberConvert::TwentyOne.into_u8(), 21u8);
assert_eq!(NumberTryConvert::TwentyOne.try_into_u8().unwrap(), 21u8);
assert_eq!(NumberConvert::from(3u8), NumberConvert::Three);
use std::convert::TryFrom;
assert_eq!(NumberTryConvert::try_from(21u8).unwrap(), NumberTryConvert::TwentyOne);
处理未知区分符
-
如果您在枚举中定义了一个具有
#[zhi_enum(unknown)]
属性的变体,如下所示#[zhi_enum(unknown)] Whatever(repr type),
其
repr type
是您定义的表示类型,使用#[repr(...)]
。然后,当您将 repr 类型转换为枚举类型时,未知区分符将转换为具有未知值的此变体。
-
如果没有定义,则
.try_into()
将返回Err(UnknownVariantError{})
,并且.into()
将调用panic!
。
常见问题解答
-
错误 E0658
如果您遇到此错误
error[E0658]: custom discriminant values are not allowed in enums with tuple or struct variants --> <source>:2:9
这意味着您的 rustc 版本低于
1.56
。您可以升级 rustc。或者,如果您不想升级,您必须将
#![feature(arbitrary_enum_discriminant)]
添加到项目中。
许可证
BSD-3-Clause
依赖关系
~1.5MB
~37K SLoC