我目前正在使用 Rust 和 deku 板条箱,并面临优化问题。
任务非常简单,我想将一些二进制数据解析成 Rust 结构。
我的代码是这样的:
#[derive(Deserialize, Debug, PartialEq, DekuRead)]
pub struct EntryU32 {
id: u8,
value: u32,
}
#[derive(Deserialize, Debug, PartialEq, DekuRead)]
pub struct EntryU16 {
id: u8,
value: u16,
}
#[derive(Deserialize, Debug, PartialEq, DekuRead)]
pub struct BinData {
entry1: EntryU32,
entry2: EntryU16,
}
// which allows me to parse the binary via BinData::from_bytes(...)
但这种方法需要为每种数据类型提供专用的
EntryStruct
→ u8
、i8
、u16
、...
所以我想使用通用的,如下所示:
#[derive(Deserialize, Debug, PartialEq, DekuRead)]
pub struct Entry<T> {
id: u8,
value: T,
}
#[derive(Deserialize, Debug, PartialEq, DekuRead)]
pub struct BinData {
entry1: Entry::<u32>,
entry2: Entry::<u32>,
}
但这会引发错误,即
DekuRead
未针对类型 T
实现。
完整错误消息:
the trait bound `T: deku::DekuRead<'_, _>` is not satisfied
the following other types implement trait `deku::DekuRead<'a, Ctx>`:
<bool as deku::DekuRead<'a, Ctx>>
<isize as deku::DekuRead<'_, (Endian, deku::ctx::ByteSize)>>
我不确定如何确定数据类型
T
的范围,以便DekuRead
(以及后来的DekuWrite
)正常工作。我尝试如下所示将其绑定,但目前我从一种错误类型绑定到另一种错误类型。
pub struct Entry<T>
where
T: Deserialize<'de> + DekuRead<'a>,
这是您需要更高排名的特征界限的少数情况之一(HRTB):
#[derive(Debug, PartialEq, DekuRead)]
pub struct Entry<T>
where T: for<'a> DekuRead<'a>,
{
id: u8,
value: T,
}