#枚举 #整数 #无分配

无标准库 enumnvictorhowisers

将数字转换为枚举

1 个不稳定版本

0.1.13 2024 年 3 月 1 日

#105#枚举


用于 zconvertenumn

MIT/Apache 协议

11KB
90 代码行,不包括注释

将数字转换为枚举

github crates.io docs.rs build status

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

生成的函数名为 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,则 n 的输入必须为此类型。

#[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,
}

在这里 Letter::n(65) 将返回 Some(Letter::A)


许可证

根据您的选择,在 Apache 许可证 2.0 版MIT 许可证 下获得许可。
除非您明确声明,否则根据 Apache-2.0 许可证定义的,您有意提交的任何贡献,都应作为上述双重许可,而不附加任何额外条款或条件。

依赖项

~285–740KB
~18K SLoC