3

我想StructParity Substrate自定义运行时中使用创建数据类型。数据类型旨在是通用的,以便我可以在不同的类型上使用它。

我正在尝试以下,但它没有编译。编译器抱怨找不到T.

pub struct CustomDataType<T> {
    data: Vec<u8>,
    balance: T::Balance,
    owner: T::AccountId,
}

我应该能够编译一个通用结构。

4

2 回答 2

6

不幸的是,Sven Marnach 给出的答案不适用于 Parity Substrate。在结构顶部使用了额外的派生宏,这些宏在沿着“直观”路径前进时会导致问题。

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

像这样的东西:

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>;
    }
}

我们刚刚为这个确切的场景创建了一个文档,希望对您有所帮助。

于 2019-01-11T14:27:20.377 回答
3

它看起来像T::Balance并且T::AcountId是某些 trait 的关联类型,因此它们只能在该 traitMyTrait被实现时使用,例如T。您可以通过添加特征绑定来告诉编译器T实现:MyTrait

pub struct CustomDataType<T: MyTrait> {
    data: Vec<u8>,
    balance: T::Balance,
    owner: T::AccountId,
}

通常,如果类型受到适当类型边界的限制,则只能假定泛型类型的属性、方法和关联类型。(唯一的例外是默认情况下假定类型参数已调整大小,因此您可以在没有明确限制的情况下进行此假设。)

于 2019-01-11T14:10:15.287 回答