我有一个功能,可以将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”。
我有什么选择?