Чтобы немного расширить здесь, как и для любого типа Rust, вам необходимо четко указать видимость различных типов. Макрос decl_storage
генерирует struct
для каждого из ваших элементов хранения. Например:
decl_storage! {
trait Store for Module<T: Trait> as TemplateModule {
Something get(something): u32;
}
}
В результате (некоторые элементы удалены для ясности):
struct Something<T: Trait>(...);
impl <T: Trait> ... for Something<T> {
fn get<S: ... >(storage: &S) -> Self::Query {
storage.get(...).unwrap_or_else(|| Default::default())
}
fn take<S: ...>(storage: &S) -> Self::Query {
storage.take(...).unwrap_or_else(|| Default::default())
}
fn mutate<R, F: FnOnce(&mut Self::Query) -> R, S: ...>(f: F, storage: &S) -> R {
let mut val = <Self as ...>::get(storage);
let ret = f(&mut val);
<Self as ...>::put(&val, storage);
ret
}
}
Если вы делаете элемент хранения pub
, вы просто вводите тег pub
в struct Something
. Это означает, что теперь вы можете вызывать все эти функции, предоставляемые структурой, например get
, take
, mutate
из других модулей. В противном случае вам потребуется создать свои собственные общедоступные функции, которые предоставляют API для изменения хранилища.