#枚举 #整数 #no-alloc

no-std enumn

将数字转换为枚举

15个版本

0.1.14 2024年7月30日
0.1.13 2024年1月2日
0.1.12 2023年9月2日
0.1.11 2023年7月21日
0.1.0 2018年12月6日

#216 in #integer

Download history 76689/week @ 2024-04-26 72468/week @ 2024-05-03 78152/week @ 2024-05-10 74719/week @ 2024-05-17 87476/week @ 2024-05-24 84848/week @ 2024-05-31 74847/week @ 2024-06-07 77189/week @ 2024-06-14 83857/week @ 2024-06-21 76507/week @ 2024-06-28 79804/week @ 2024-07-05 85629/week @ 2024-07-12 92822/week @ 2024-07-19 93324/week @ 2024-07-26 94186/week @ 2024-08-02 110654/week @ 2024-08-09

407,751 每月下载量
284 个crate中(22直接) 使用

MIT/Apache

11KB
90

将数字转换为枚举

github crates.io docs.rs build status

此crate提供了一个派生宏,用于生成将原始整数转换为枚举相应变体的函数。

生成的函数名为 n,其签名如下

impl YourEnum {
    pub fn n(value: Repr) -> Option<Self>;
}

其中 Repr 是一个整数类型,其大小如以下更详细描述中所述。

示例

use enumn::N;

#[derive(PartialEq, Debug, N)]
enum Status {
    LegendaryTriumph,
    QualifiedSuccess,
    FortuitousRevival,
    IndeterminateStalemate,
    RecoverableSetback,
    DireMisadventure,
    AbjectFailure,
}

fn main() {
    let s = Status::n(1);
    assert_eq!(s, Some(Status::QualifiedSuccess));

    let s = Status::n(9);
    assert_eq!(s, None);
}

签名

生成的签名取决于枚举是否有 #[repr)] 属性。如果指定了 repr,则输入的代码必须为该类型。

#[derive(enumn::N)]
#[repr(u8)]
enum E {
    /* ... */
}

// expands to:
impl E {
    pub fn n(value: u8) -> Option<Self> {
        /* ... */
    }
}

另一方面,如果没有指定 repr,则签名将泛化到多种可能类型。

impl E {
    pub fn n<REPR: Into<i64>>(value: REPR) -> Option<Self> {
        /* ... */
    }
}

判别器

转换将尊重显式指定的枚举判别器。考虑以下枚举

#[derive(enumn::N)]
enum Letter {
    A = 65,
    B = 66,
}

Here Letter::n((65)) 会返回 Some::Letter::A.


许可

根据您的选择,许可为Apache许可证,版本2.0MIT许可证
除非您明确声明,否则任何有意提交以包含在此crate中的贡献,根据Apache-2.0许可证定义,都应按上述方式双许可,不得附加任何额外条款或条件。

依赖

~270–720KB
~17K SLoC