Rustlang deku 泛型类型

问题描述 投票:0回答:1

我目前正在使用 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>,
parsing rust
1个回答
0
投票

这是您需要更高排名的特征界限的少数情况之一(HRTB)

#[derive(Debug, PartialEq, DekuRead)]
pub struct Entry<T>
where T: for<'a> DekuRead<'a>,
{
    id: u8,
    value: T,
}
© www.soinside.com 2019 - 2024. All rights reserved.