Rust 如何包括<;T作为特征>;::基板框架托盘内结构中的块编号

Rust 如何包括<;T作为特征>;::基板框架托盘内结构中的块编号,rust,substrate,Rust,Substrate,有谁能告诉我如何在托盘模块的结构中包含::BlockNumber和::AccountId 我当前的解决方案是添加一个通用参数T,其中Trait绑定到“Trait” 我认为在decl\u模块中将该泛型结构用作函数参数类型(第72行)确实会导致以下错误: 错误[E0277]:T未实现std::fmt::Debug --剪断-- =help:traitstd::fmt::Debug未为T =注:由于std::fmt::Debug对于PhysicalProof =注:由于标准::fmt::调试的impl

有谁能告诉我如何在托盘模块的结构中包含
::BlockNumber
::AccountId

我当前的解决方案是添加一个通用参数T,其中Trait绑定到“Trait”

我认为在
decl\u模块中将该泛型结构用作函数参数类型(第72行)确实会导致以下错误:

错误[E0277]:
T
未实现
std::fmt::Debug

--剪断--

=help:trait
std::fmt::Debug
未为
T

=注:由于
std::fmt::Debug
对于
PhysicalProof

=注:由于
标准::fmt::调试
的impl要求(物理证明,)

=注:
std::fmt::Debug::fmt

=注意:此错误源于宏(在夜间构建中,使用-Z宏反向跟踪运行以获取更多信息)

<>帮助:考虑进一步限制这个界限

impl$crate::dispatch::fmt::Debug


我已尝试在该结构中为T手动实现
fmt::Debug
,但这不是解决方案,或者我无法正确执行。

要为as结构派生
Debug
,其所有字段必须能够实现
Debug
。现在,编译器不知道
t
是否可调试

通过添加
Debug
作为类型
T
的绑定,可以告诉编译器
T
实现了
Debug

#[派生(调试)]
发布结构物理证明,其中
//'T'必须实现'Debug'
T:Trait+Debug,
{
证明:证明数据,
日期:T::BlockNumber,
}
解决问题的建议:

在守则中:


///包含证明的结构
#[导出(调试)]
发布结构物理证明,其中
校对数据:编解码器+克隆+调试+解码+编码+均衡+部分均衡,
T:特质,
{
证明:证明数据,
日期:T::BlockNumber,
}
将对PhysicalPool执行
impl Debug,其中…,ProofData:Debug,T:Debug
此附加边界在您的情况下是不需要的,但仍然需要添加它们。 因此,当您尝试使用stuct时,它会说它没有实现调试,因为t没有实现调试

一种解决方案是手动执行,另一种解决方案是:

/// Structure that contains the proof
#[derive(Debug)]
pub struct PhysicalProof<BlockNumber ProofData> where
  ProofData: Codec + Clone + Debug + Decode + Encode + Eq + PartialEq, BLockNumber: ...
{
  proof: ProofData,
  date: BlockNumber,
}
///包含证明的结构
#[导出(调试)]
发布结构物理证明,其中
校对数据:编解码器+克隆+调试+解码+编码+均衡+部分量化,区块编号:。。。
{
证明:证明数据,
日期:BlockNumber,
}

我不确定我是否正确理解了你的问题。你能提供一个最小的可复制的例子吗?在我看来,删除
T
并添加
BlockNumber
作为一个泛型有一个缺点:因为
BlockNumber
不能直接导入,特征边界必须从声明
BlockNumber
的板条箱中复制。这样,以后对该类型的任何更新都不会反映在结构中。出于这个原因,我决定为包含
T
的结构实现一个基本的调试特性。这和我在回答中解释的不完全一样吗?@IbraheemAhmed我认为解决方案有点不同。你的答案大体上是正确的,解释得很好,谢谢你花时间解释得那么清楚。在基板的上下文中,托盘使用的Trait的实现由宏生成,不能直接修改。在这个场景中,可以应用Guillaume建议的解决方案:要么使用BlockNumber,它是Trait中具有Debug Trait绑定的类型,要么为PhysicalProof结构实现Debug Trait。我还是个初学者。基板专家,请纠正我。