Enums 如何创建其变体由多个板条箱定义的类枚举类型?

Enums 如何创建其变体由多个板条箱定义的类枚举类型?,enums,rust,Enums,Rust,我正在开发一个生成和处理I/O事件的系统。我想通过创建“过滤器”来实现这一点,这些过滤器处理他们理解的事件,并将所有其他事件转发给回退过滤器。例如,控制台输出板条箱可以定义PrintString和SetColor事件,并公开ConsoleOutputFilter: // pseudo-Rust for an event filter impl<Fallback: EventFilter> EventFilter for ConsoleOutputFilter<Fallback&

我正在开发一个生成和处理I/O事件的系统。我想通过创建“过滤器”来实现这一点,这些过滤器处理他们理解的事件,并将所有其他事件转发给回退过滤器。例如,控制台输出板条箱可以定义
PrintString
SetColor
事件,并公开
ConsoleOutputFilter

// pseudo-Rust for an event filter
impl<Fallback: EventFilter> EventFilter for ConsoleOutputFilter<Fallback> {
    fn handle(evt: Event) {
        match evt {
            PrintString(str) => print!("{}", str),
            SetColor(r, g, b) => { /* somehow change the text color */ },
            _ => Fallback::handle(evt)
        }
    }
}
//事件筛选器的伪锈
ConsoleOutputFilter的impl EventFilter{
fn句柄(evt:事件){
匹配evt{
PrintString(str)=>print!(“{}”,str),
SetColor(r,g,b)=>{/*以某种方式更改文本颜色*/},
_=>回退::句柄(evt)
}
}
}
如果
ConsoleOutputFilter
接收到任何其他类型的事件(例如,GUI板条箱定义的
AlertBox
事件),它将忽略它并将其传递给链中的下一个事件过滤器

这似乎是一个合理的设计,但我不确定如何定义
事件
类型。一开始使用枚举似乎是一个合理的选择,但这意味着我必须在一个板条箱中定义所有可能的事件,而不是将它们拆分为多个包

建议使用trait对象,但我不确定如何处理每个事件类型可能具有不同关联数据类型的事实。我还希望能够序列化/反序列化事件(例如,通过网络发送事件),而这在trait对象中似乎是不可能的


在Rust中,是否有一种方法可以创建一种行为类似于带有相关数据的枚举的类型,但其变体可以在多个板条箱中定义?

我认为最好的方法是使用trait。定义契约(例如,使用回调),然后不管实现特征的数据是什么。
Box
将很容易解决分派部分,但序列化肯定更棘手。我不确定serde是否满足要求;您可能需要投资于您自己的序列化系统(并且有一个基于具体类型的“标记”分派到的反序列化函数注册表)。