1个不稳定版本
0.0.1 | 2023年7月18日 |
---|
#24 in #discriminant
11KB
236 行
soccer
Rust枚举的关联常量
注意:测试和文档目前仍在进行中
基本示例
soccer
可以通过派生TryFrom
、Into
和Display
,生成代码以便将无字段的枚举视为一组离散的常量,从而简化处理。
#[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