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解决方案。)