Как использовать общие структуры в пользовательской среде выполнения Parity Substrate?
Я хочу создать тип данных, используя Struct
внутри пользовательской среды паритета четности. Тип данных предназначен для общего использования, чтобы я мог использовать его для разных типов.
Я пытаюсь следующее, но это не компилируется. Компилятор жалуется на подтипы, не найденные для T
,
pub struct CustomDataType<T> {
data: Vec<u8>,
balance: T::Balance,
owner: T::AccountId,
}
Я должен быть в состоянии скомпилировать общую структуру.
2 ответа
К сожалению, ответ, который дает Свен Марнах, не работает в контексте паритетного субстрата. Существуют дополнительные макросы производных, которые используются поверх структуры и вызывают проблемы при переходе по "интуитивному" пути.
В этом случае вы должны передать необходимые черты непосредственно в ваш пользовательский тип и создать новые обобщенные элементы для контекста структуры.
Что-то вроде этого:
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>;
}
}
Мы только что создали документ для этого точного сценария, который, я надеюсь, поможет.
Это выглядит как T::Balance
а также T::AcountId
являются ассоциированными типами некоторой черты, поэтому они могут быть использованы, только если эта черта, скажем, MyTrait
, реализовано для T
, Вы можете сказать компилятору, что T
инвентарь MyTrait
добавив предел черты:
pub struct CustomDataType<T: MyTrait> {
data: Vec<u8>,
balance: T::Balance,
owner: T::AccountId,
}
В общем случае вы можете принимать свойства, методы и связанные типы универсального типа только в том случае, если тип ограничен соответствующими границами типов. (Единственное исключение состоит в том, что параметры типа по умолчанию имеют размер, поэтому вы можете сделать это предположение без явной границы.)