#enums #derive #repr #attributes #field #zhi-enum #enum-convert

zhi_enum_derive

提供使用枚举的宏,易于使用。

2 个版本

0.1.2 2021年10月7日
0.1.1 2021年10月1日
0.1.0 2021年10月1日

#41 in #repr


用于 zhi_enum

BSD-3-Clause

17KB
385

智枚举

轻松创建具有未知字段支持的转换特征。

用法

  1. EnumConvertEnumTryConvert 添加到 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),
}

  1. 然后,您可以使用 .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 类型 是您定义的表示类型,使用 #[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