#enums #traits #variant #macro #payload #numbers #unitary

enum-unitary

单元枚举的特性和宏

15 个版本

0.5.0 2022年7月9日
0.4.4 2021年12月8日
0.4.3 2021年8月11日
0.4.2 2020年5月25日
0.3.3 2018年5月11日

1177Rust 模式

Download history 1/week @ 2024-03-09 1/week @ 2024-03-23 105/week @ 2024-03-30 20/week @ 2024-04-06

94 每月下载量

Apache-2.0

14KB
246 代码行

enum-unitary

单元枚举的特性和宏

文档

EnumUnitary 特性为遍历单元枚举的变体(即枚举变体没有有效负载)的原始转换提供了一系列约束。

enum_unitary! 宏定义了一个实现 EnumUnitary 和所需特性的新枚举。

使用方法

为了使宏生成 Sequence,还需要将 enum-iterator 包添加到 Cargo.toml

enum-iterator = "1.0"
enum-unitary = "0.5"

定义单元枚举

use enum_unitary::{enum_unitary, EnumUnitary, FromPrimitive, ToPrimitive};

enum_unitary! {
  #[derive(Debug, PartialEq)]
  pub enum E {
    A, B, C
  }
}

assert_eq!(enum_iterator::cardinality::<E>(), 3);
assert_eq!(Into::<usize>::into (E::A), 0);
assert_eq!(Into::<usize>::into (E::B), 1);
assert_eq!(Into::<usize>::into (E::C), 2);
assert_eq!(enum_iterator::first::<E>().unwrap(), E::A);
assert_eq!(enum_iterator::last::<E>().unwrap(),  E::C);
let mut i = enum_iterator::all::<E>();
assert_eq!(i.next(), Some (E::A));
assert_eq!(i.next(), Some (E::B));
assert_eq!(i.next(), Some (E::C));
assert_eq!(i.next(), None);
assert_eq!(enum_iterator::next (&E::A), Some (E::B));
assert_eq!(enum_iterator::previous (&E::A), None);
assert_eq!(enum_iterator::next (&E::B), Some (E::C));
assert_eq!(enum_iterator::previous (&E::B), Some (E::A));
assert_eq!(enum_iterator::next (&E::C), None);
assert_eq!(enum_iterator::previous (&E::C), Some (E::B));

依赖项

~0.4–1MB
~21K SLoC