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
5KB
为具有不同类型变体的枚举创建提供更简洁的属性宏。
同时也自动实现了 From
,TryFrom
和 fn 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::Deref
和 std::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