Как следует делать рассылки по двум типам? - PullRequest
1 голос
/ 02 августа 2020

В этом коде:

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
                ()
            }
        }
    }
}

есть непривлекательный шаблон, больше в полной игровой площадке.

Полностью: https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=acca055b435ae21d141eaac70e097e72

Я хочу, чтобы каждый Msg мог применяться к StateOne, StateTwo или к любому из них (через их общее поле, common).

Msg с ошибкой при применении к состоянию, для которого у них нет реализации.

Я бы предпочел, чтобы все logi c были в отдельных сообщениях, а не в Msg или State s.

Как мне лучше express это в системе типов Rust?

Обновление: я особенно хочу узнать, подходит ли мой общий подход к этой проблеме для Rust, или есть ли лучшие решения, если бы сообщения или состояния были общими или dyn trait объектами.

1 Ответ

1 голос
/ 02 августа 2020
• 1000 в (Msg::MsgC(m), State::StateOne(StateOne {mut common, ..}) | State::StateTwo(StateTwo {mut common, ..})).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...