【发布时间】:2020-08-02 15:27:03
【问题描述】:
在这段代码中:
impl Msg {
fn apply_to(&self, state: &mut State) {
match (self, state) {
(Msg::MsgA(m), State::StateOne(s)) => {
m.apply_to_state_one(s);
},
(Msg::MsgB(m), State::StateOne(s)) => {
m.apply_to_state_one(s);
},
// FIXME: can these two dispatches be made into one
(Msg::MsgC(m), State::StateOne(s)) => {
m.apply_to_common_state(&mut s.common);
},
(Msg::MsgC(m), State::StateTwo(s)) => {
m.apply_to_common_state(&mut s.common);
},
(Msg::MsgD(m), State::StateTwo(s)) => {
m.apply_to_state_two(s);
},
(_, _) => { // don't care
()
}
}
}
}
有一些没有吸引力的样板,更多的是在完整的操场上。
我希望每个Msg 都能够应用于StateOne、StateTwo 或任何一个(通过它们的公共字段common)。
Msgs 在应用于他们没有实现的状态时应该出错。
我希望所有逻辑都在单个消息中,Msg 或 States 中没有。
如何在 Rust 的类型系统中最好地表达这一点?
更新:我特别想知道我解决此问题的一般方法是否适用于 Rust,或者如果消息或状态是泛型或 dyn trait 对象,是否有更好的解决方案。
【问题讨论】: