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