如何在奇偶校验底物自定义运行时中使用通用结构?

时间:2019-01-11 13:53:09

标签: rust substrate

我想在Parity Substrate自定义运行时中使用Struct创建数据类型。数据类型是通用的,因此我可以在不同的类型上使用它。

我正在尝试以下操作,但尚未编译。编译器抱怨找不到T的子类型。

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

我应该能够编译通用结构。

2 个答案:

答案 0 :(得分:5)

不幸的是,the answer that Sven Marnach gives在奇偶校验衬底的环境中不起作用。在结构顶部使用了其他派生宏,这些宏在沿“直观”路径运行时会引起问题。

在这种情况下,您应该将所需的特征直接传递到自定义类型中,并为该结构的上下文创建新的泛型。

类似这样的东西:

q = {
   "query": {
    "match_all": {}
    }
},
"script": {
    "lang" : "painless",
    "inline" : {if (ctx._source.dataId == item.dataId && ctx._source.versionId == item.versionId && ctx._source.items.obj1 == item.obj1) {ctx._source.items.remove()}}",
    "params" : {
        'dataFrame': [{
            "dataId" : 'myDataIdList',
            "versionId" : 'myVersionId',
            "obj1" : 'myValue'
            } ]
    }
 }    
}

es.update_by_query(index=myindex, body=q)

我们刚刚创建了a doc for this exact scenario,希望对您有所帮助。

答案 1 :(得分:3)

看起来T::BalanceT::AcountId是某些特征的关联类型,因此只有在为MyTrait实现了该特征(例如T)时才能使用它们。您可以通过添加特征绑定来告诉编译器T实现了MyTrait

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

通常,如果类型受适当的类型界限限制,则只能假定通用类型的属性,方法和关联类型。 (唯一的例外是默认假定类型参数的大小为 ,因此您可以进行此假设而没有明确的限制。)