Rust:Enum vs Impl特性vs?

时间:2019-03-29 14:17:57

标签: enums rust stack traits serde

我有一个功能,可以将UnixStream中的内容反序列化为具体的结构定义。这些结构可以是许多变体之一:我最初选择了一个枚举,但是clippy有用地指出了像这样的变体

pub enum EventResponse {
    Workspace(WorkspaceData), 
    Output(OutputData),
    Mode(ModeData),
}

如果WorkspaceData很大并且具有比其他字段更多的字段,则效率低下。这样会增加每个变体的最小尺寸。

要解决此问题,请在反序列化中,我选择一些变体:

pub enum EventResponse {
    Workspace(Box<WorkspaceData>),
    Output(OutputData),
    Mode(ModeData)
}
  pub fn receive_evt(&mut self) -> io::Result<event::EventResponse> {
        let (evt_type, payload_bytes) = self.decode_msg()?;
        let body = match evt_type.into() {
            Event::Workspace => {
                EventResponse::Workspace(Box::new(serde_json::from_slice::<event::WorkspaceData>(
                    &payload_bytes[..],
                )?))
            }
            Event::Output => EventResponse::Output(serde_json::from_slice::<event::OutputData>(
                &payload_bytes[..],
            )?),
            Event::Mode => EventResponse::Mode(serde_json::from_slice::<event::ModeData>(
                &payload_bytes[..],
            )?),
        };
        Ok(body)
    }

但是,如果我不必装箱任何变体,那就太好了。随着impl Trait的出现,现在有办法做到这一点吗?

我真的很想要像这样的东西

 pub fn receive_evt_2<D: DeserializeOwned>(
        &mut self,
    ) -> io::Result<EventResp<impl DeserializeOwned>> {
        let (evt_type, payload_bytes) = self.decode_msg()?;
        let evt_type = evt_type.into();
        let body = match evt_type {
            Event::Workspace => serde_json::from_slice::<event::WorkspaceData>(&payload_bytes[..])?,
            Event::Output => serde_json::from_slice::<event::OutputData>(&payload_bytes[..])?,
            Event::Mode => serde_json::from_slice::<event::ModeData>(&payload_bytes[..])?,
        };
        Ok(EventResp { evt_type, body })
    }

但这会返回错误,例如“期望类型为WorkspaceData,找到类型为OutputData”。

我有什么选择?

0 个答案:

没有答案