如何在 Parity Substrate 自定义运行时中使用通用结构?
How to use generic structs in the Parity Substrate custom runtime?
我想在 Parity Substrate 自定义运行时中使用 Struct
创建数据类型。数据类型旨在是通用的,以便我可以在不同类型上使用它。
我正在尝试以下操作,但无法编译。编译器抱怨找不到 T
.
的子类型
pub struct CustomDataType<T> {
data: Vec<u8>,
balance: T::Balance,
owner: T::AccountId,
}
我应该能够编译通用结构。
看起来 T::Balance
和 T::AcountId
是某些特征的相关类型,因此它们只能在 MyTrait
的特征实现时使用 T
].你可以告诉编译器 T
通过添加特征边界实现 MyTrait
:
pub struct CustomDataType<T: MyTrait> {
data: Vec<u8>,
balance: T::Balance,
owner: T::AccountId,
}
一般来说,如果类型受适当的类型界限限制,您只能假定泛型的属性、方法和关联类型。 (唯一的例外是默认情况下假定类型参数的大小为 ,因此您可以在没有明确限制的情况下进行此假设。)
不幸的是, 在 Parity Substrate 的上下文中不起作用。在结构之上使用了额外的派生宏,这在沿着 "intuitive" 路径向下移动时会导致问题。
在这种情况下,您应该将所需的特征直接传递到您的自定义类型中,并为结构的上下文创建新的泛型。
像这样:
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>;
}
}
我们刚刚创建了 a doc for this exact scenario,希望对您有所帮助。
我想在 Parity Substrate 自定义运行时中使用 Struct
创建数据类型。数据类型旨在是通用的,以便我可以在不同类型上使用它。
我正在尝试以下操作,但无法编译。编译器抱怨找不到 T
.
pub struct CustomDataType<T> {
data: Vec<u8>,
balance: T::Balance,
owner: T::AccountId,
}
我应该能够编译通用结构。
看起来 T::Balance
和 T::AcountId
是某些特征的相关类型,因此它们只能在 MyTrait
的特征实现时使用 T
].你可以告诉编译器 T
通过添加特征边界实现 MyTrait
:
pub struct CustomDataType<T: MyTrait> {
data: Vec<u8>,
balance: T::Balance,
owner: 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>;
}
}
我们刚刚创建了 a doc for this exact scenario,希望对您有所帮助。