1个不稳定版本

0.0.1 2023年7月18日

#24 in #discriminant

MIT许可证

11KB
236

soccer

Rust枚举的关联常量

注意:测试和文档目前仍在进行中

基本示例

soccer可以通过派生TryFromIntoDisplay,生成代码以便将无字段的枚举视为一组离散的常量,从而简化处理。

#[derive(Clone, Copy, PartialEq, Eq, TryFrom, Into, Display)]
#[const_ty(char)]
enum Punctuation {
    Plus,
    Minus,
    Star,
    Equals,
}

fn main() {
    assert_eq!(Punctuation::try_from('+'), Ok(Punctuation::Plus));

    let val: char = Punctuation::Star.into();
    assert_eq!(val, '*');

    println!("{}", Punctuation::Minus); // prints "-"
}

它还可以使用区分符(discriminant)来实现这一点

#[derive(Clone, Copy, PartialEq, Eq, TryFrom, Into, Display)]
#[repr(u8)]
enum Opcode {
    Add,
    Sub,
    Mul,
    Load,
    Store,
}

fn main() {
    assert_eq!(Opcode::try_from(0), Ok(Opcode::Add));

    let val: u8 = Opcode::Load.into();
    assert_eq!(val, 3);

    println!("{}", Opcode::Store); // prints "4"
}

这两个都是我在自己的Rust项目中遇到的实际用例,也是我创建这个crate的动机。

(我之前维护了https://github.com/a-lafrance/discrim crate,用于基于区分符的转换代码生成,但自从它被整合到soccer中后,我已经将其存档,不再维护它了)

依赖项

~285–740KB
~18K SLoC