7个版本
0.1.6 | 2024年2月25日 |
---|---|
0.1.5 | 2023年12月3日 |
0.1.4 | 2023年11月20日 |
0.1.1 | 2023年10月29日 |
#1607 在 Rust模式
每月 57 次下载
38KB
763 代码行
type_enum
type_enum
提供了一种简洁且不侵入的方式
- 创建由不同类型组成的标签联合体
- 执行所有类型变体上通用的trait方法
- 根据类型变体进行匹配以恢复原始类型
此crate需要nightly Rust。
示例
use type_enum::*;
type Good = type_list! { u8, i32, String };
let val = TypeEnum::<Good>::new(-23);
// Enums may be cast to any trait common among all enum variants.
println!("{}", val.cast::<dyn ToString>().to_string());
// Enums may be matched to obtain the original type.
let abs = type_match(val)
.with::<u8>(|x| x as i32)
.with::<i32>(|x| x.abs())
.otherwise(|| 0)
.get();
println!("{abs}");
为什么不使用普通枚举呢?
虽然Rust的枚举类型非常强大,但它们将扩展功能实现新特质的负担放在了枚举定义上。例如,考虑以下代码片段
pub enum Bad { U8(u8), U16(u16), String(String) }
pub trait NewBehavior {}
impl NewBehavior for u8 {}
impl NewBehavior for u16 {}
impl NewBehavior for String {}
尽管所有三个组成类型都实现了NewBehavior
,但枚举没有。向枚举添加功能需要修改其定义;它不会从其变体继承行为。如果Bad
和NewBehavior
在单独的crate中定义,则在Bad
上实现NewBehavior
可能甚至是不可能的。type_enum
反转了这一点 - 可用于TypeEnum
的trait是从变体继承的。这允许通过修改和维护类型变体来扩展代码。
可选功能
serde - 当所有变体都可序列化时,允许序列化TypeEnum
实例。
依赖项
~170KB