我正在研究一个生成和处理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
收到任何其他类型的事件(例如,由GUI包定义的AlertBox
事件),它将忽略它并将其传递给链中的下一个事件过滤器。 / p>
这似乎是一个合理的设计,但我不确定如何定义Event
类型。一开始使用枚举似乎是一个合理的选择,但这意味着我必须在一个包中定义所有可能的事件,而不是将它们分成多个包。
An answer to a similar question建议使用特征对象,但我不确定如何处理每个事件类型可能具有不同的关联数据类型的事实。我还希望能够序列化/反序列化事件(例如通过网络发送它们),而且特性对象似乎不可能。
在Rust中,有没有办法创建一种行为类似于带有关联数据的枚举的类型,但是其变体可以在多个包中定义?