Как использовать общие структуры в пользовательской среде выполнения Parity Substrate? - PullRequest
0 голосов
/ 11 января 2019

Я хочу создать тип данных, используя Struct внутри субстрата четности пользовательской среды выполнения. Тип данных предназначен для общего использования, чтобы я мог использовать его для разных типов.

Я пытаюсь сделать следующее, но это не компилируется. Компилятор жалуется на подтипы, не найденные для T.

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

Я должен быть в состоянии скомпилировать общую структуру.

Ответы [ 2 ]

0 голосов
/ 11 января 2019

К сожалению, ответ, который Свен Марнах дает , не работает в контексте субстрата четности. Существуют дополнительные макросы производных, которые используются поверх структуры и вызывают проблемы при переходе по «интуитивному» пути.

В этом случае вы должны передать необходимые черты непосредственно в ваш пользовательский тип и создать новые обобщенные элементы для контекста структуры.

Примерно так:

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

Мы только что создали документ для этого точного сценария , который, я надеюсь, поможет.

0 голосов
/ 11 января 2019

Похоже, T::Balance и T::AcountId являются ассоциированными типами некоторой черты, поэтому их можно использовать только в том случае, если эта черта, скажем MyTrait, реализована для T. Вы можете сказать компилятору, что T реализует MyTrait, добавив границу черты:

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

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

...