1 个不稳定版本

使用旧的 Rust 2015

0.1.0 2018 年 11 月 24 日

#8 in #macro-use

MIT 许可证

8KB
85

e_num

将枚举序列化为数字。

警告

此库通过位操作将包含值的数字表示形式右移,以使标记可以放在数字的右侧,从而与具有变体字段(例如 Variant1(u64))的变体一起工作。如果您在字段中处理非常大的数字或有很多变体,值左侧的数据可能会丢失。

用法

#[macro_use]
extern crate e_num;

use e_num::ENum;

#[derive(ENum)]
enum A {
  B,
  C(u64),
}

fn main() {
  let b: usize = A::B.to_num();
  println!("b as a number: {:#b}", b);
  let b = A::from_num(b);
  assert!(match b {
    A::B => true,
    _ => false,
  });
  let c = A::C(85).to_num();
  println!("c as a number: {:#b}", c);
  let c = A::from_num(c);
  assert!(match c {
    A::C(inner) => {
      assert_eq!(inner, 85);
      true
    }
    _ => false,
  });
}

许可证

本项目采用 MIT 许可证。有关更多详细信息,请参阅 LICENSE 文件。


lib.rs:

E-Num(ber)

将枚举序列化为数字。

警告

此库通过位操作将包含值的数字表示形式右移,以使标记可以放在数字的右侧,从而与具有变体字段(例如 Variant1(u64))的变体一起工作。如果您在字段中处理非常大的数字或有很多变体,值左侧的数据可能会丢失。

基本用法

#[macro_use]
extern crate e_num;

use e_num::ENum;

#[derive(ENum)]
enum A {
  B,
  C(u64),
}

fn main() {
  let b: usize = A::B.to_num();
  println!("b as a number: {:#b}", b);
  let b = A::from_num(b);
  assert!(match b {
    A::B => true,
    _ => false,
  });
  let c = A::C(85).to_num();
  println!("c as a number: {:#b}", c);
  let c = A::from_num(c);
  assert!(match c {
    A::C(inner) => {
      assert_eq!(inner, 85);
      true
    }
    _ => false,
  });
}

start_at 和常量变体

#[macro_use]
extern crate e_num;

use e_num::ENum;

#[derive(ENum)]
// where the non-constant variants will start counting from
#[e_num(start_at = 9)]
enum A {
  // pulls the specified variant out from the rest of them
  // and matches it against that number. constant variants
  // can't have a field.
  #[e_num(constant = 2)]
  B,
  C,
  D,
  E,
}

fn main() {
  assert_eq!(A::B.to_num(), 2);
  assert_eq!(A::C.to_num(), 9);
  assert_eq!(A::D.to_num(), 10);
  assert_eq!(A::E.to_num(), 11);
}

依赖关系

~2.5MB
~54K SLoC