#枚举 #类型 #sum #union #tagged

nightly tyenum

类型枚举的属性宏

4个版本 (2个破坏性更新)

0.5.0 2019年4月19日
0.2.1 2019年4月14日
0.2.0 2019年4月14日
0.1.0 2019年4月13日

Rust模式 中排名 #1342

MIT 协议

5KB

为具有不同类型变体的枚举创建提供更简洁的属性宏。

同时也自动实现了 FromTryFromfn is<T>() -> bool 以检查其内部项是否为类型 T,并能够根据您指定的参数提供特例对象。

基本用法

use tyenum::tyenum;

struct A;
struct B;
struct C;

#[tyenum]
enum Test {
    A,
    BB(B),
    C(C),
}

结果为

enum Test {
    A(A),
    BB(B),
    C(C),
}

并允许

assert_eq!(Test::A(A), A.into());
assert!(Test::A(A).is::<A>());
assert_eq!(Test::A(A).try_into(), Ok(A));

参数

tyenum 还接受两个可选参数

derive

#[tyenum(derive=[Display])]
enum Test {
    A,
    BB(B),
}

trait Name {
    fn name(&self) -> String;
}

impl Name for A {
    fn name(&self) -> String {
        String::from("A")
    }
}

impl Name for B {
    fn name(&self) -> String {
        String::from("B")
    }
}

这实现了 std::ops::Derefstd::ops::DerefMut 到枚举派生特质的特例对象,这允许您轻松调用特例方法,这些方法将被重定向到变体

assert_eq!("A", Test::A(A).name());

trait_obj

需要nightly和#![feature(specialization)],并会污染您的命名空间,将生成一个名为"ToTraitObject"的特质!

#[tyenum(trait_obj=[Name])]
enum Test {
    A,
    BB(B),
}

trait Name {
    fn name(&self) -> String;
}

impl Name for A {
    fn name(&self) -> String {
        String::from("A")
    }
}

允许您这样做

fn try_print_name(test: Test) {
    if let Some(named) = test.trait_obj() {
        println!("{}",named.name());
    }
}

依赖项

~2MB
~45K SLoC