Rust 如何在自定义运行时中使用泛型结构?

Rust 如何在自定义运行时中使用泛型结构?,rust,substrate,Rust,Substrate,我想在自定义运行时内使用Struct创建一个数据类型。数据类型是泛型的,因此我可以在不同的类型上使用它 我正在尝试以下内容,但它不是编译。编译器抱怨未找到T的子类型 pub struct CustomDataType<T> { data: Vec<u8>, balance: T::Balance, owner: T::AccountId, } pub结构CustomDataType{ 资料来源:Vec, 平衡:T::平衡, 所有者:T::Acco

我想在自定义运行时内使用
Struct
创建一个数据类型。数据类型是泛型的,因此我可以在不同的类型上使用它

我正在尝试以下内容,但它不是编译。编译器抱怨未找到
T
的子类型

pub struct CustomDataType<T> {
    data: Vec<u8>,
    balance: T::Balance,
    owner: T::AccountId,
}
pub结构CustomDataType{
资料来源:Vec,
平衡:T::平衡,
所有者:T::AccountId,
}

我应该能够编译一个泛型结构。

它看起来像是
T::Balance
T::acoontid
是某些特征的关联类型,因此它们只能在该特征(比如
MyTrait
)为
T
实现时使用。通过添加特征绑定,可以告诉编译器
T
实现了
MyTrait

pub struct CustomDataType<T: MyTrait> {
    data: Vec<u8>,
    balance: T::Balance,
    owner: T::AccountId,
}
pub结构CustomDataType{
资料来源:Vec,
平衡:T::平衡,
所有者:T::AccountId,
}
通常,如果泛型类型受适当的类型边界限制,则只能假定泛型类型的属性、方法和关联类型。(唯一的例外是默认情况下假定类型参数的大小,因此您可以在没有显式绑定的情况下进行此假定。)

不幸的是,在奇偶校验的上下文中不起作用。在结构顶部使用的其他派生宏在沿着“直观”路径运行时会导致问题

在这种情况下,您应该将所需的特征直接传递到自定义类型中,并为结构的上下文创建新的泛型

大概是这样的:

use srml_support::{StorageMap, dispatch::Result};

pub trait Trait: balances::Trait {}

#[derive(Encode, Decode, Default)]
pub struct CustomDataType <Balance, Account> {
    data: Vec<u8>,
    balance: Balance,
    owner: Account,
}

decl_module! {
    // ... removed for brevity
}

decl_storage! {
    trait Store for Module<T: Trait> as RuntimeExampleStorage {
        Value get(value): CustomDataType<T::Balance, T::AccountId>;
    }
}
使用srml_支持::{StorageMap,dispatch::Result};
发布特性:平衡::特性{}
#[导出(编码、解码、默认)]
pub结构CustomDataType{
资料来源:Vec,
平衡:平衡,,
所有者:帐户,
}
decl_模块!{
//…为简洁起见,请删除
}
decl_仓库!{
模块的特征存储为RuntimeExampleStorage{
值获取(Value):CustomDataType;
}
}

我们刚刚创建了一个我希望有帮助的对象。

编译器将不知道关联的类型
Balance
AccountId
来自何处,除非您在提供它们的
T
上应用trait绑定。下一次,请看看什么是正确的,不要忘记包括相关的板条箱和模块。请回顾如何创建一个,然后你的问题,包括它。我们无法说出代码中存在哪些板条箱、类型、特征、字段等。试着制造一些能再现你在网络上的错误的东西,或者你可以在一个全新的货运项目中再现它。也有。