Как использовать общие структуры в пользовательской среде выполнения 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,
}

В общем случае вы можете принимать свойства, методы и связанные типы универсального типа только в том случае, если тип ограничен соответствующими границами типов. (Единственное исключение состоит в том, что параметры типа по умолчанию имеют размер, поэтому вы можете сделать это предположение без явной границы.)

Другие вопросы по тегам