#variant #unions #tagged #enums #different #methods #execute

nightly 类型_enum

创建由不同类型组成的标签联合体

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日

#1607Rust模式

Download history 63/week @ 2024-04-14 57/week @ 2024-07-28

每月 57 次下载

MIT/Apache

38KB
763 代码行

type_enum

Crates.io Docs.rs Nightly

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,但枚举没有。向枚举添加功能需要修改其定义;它不会从其变体继承行为。如果BadNewBehavior在单独的crate中定义,则在Bad上实现NewBehavior可能甚至是不可能的。type_enum反转了这一点 - 可用于TypeEnum的trait是从变体继承的。这允许通过修改和维护类型变体来扩展代码。

可选功能

serde - 当所有变体都可序列化时,允许序列化TypeEnum实例。

依赖项

~170KB