В этом коде:
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
объектами.