Enums 应如何对两种类型进行调度?
在此代码中:Enums 应如何对两种类型进行调度?,enums,rust,Enums,Rust,在此代码中: 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::Stat
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
)
Msg
s应用于没有实现的状态时应出错
我希望所有的逻辑都在单独的消息中,在Msg
或状态中没有逻辑
如何在Rust的类型系统中最好地表达这一点
更新:我特别想知道我对这个问题的一般方法是否正确,或者消息或状态是泛型还是<代码> Dyn特性对象?是否有更好的解决方案。
(Msg::MsgC(m),State::StateOne(StateOne{mut common,…}))
|(Msg::MsgC(m),State::StateTwo(StateTwo{mut common,…}))=>{
m、 将_应用于_公共_状态(&mut common);
},
它不是最漂亮的,但在稳定下来之后,它可能会被简化成(Msg::MsgC(m),State::StateOne(StateOne{mut common,…})| State::StateTwo(StateTwo{mut common,…}))
,谢谢你的回答。这些解决方案虽然有了有益的改进,但仍然不能让我感觉到我做得对。(作为比较,我将编写一个Java解决方案。)