底物对存储中的选项类型有特殊的作用吗?

时间:2019-12-03 08:28:32

标签: storage substrate

我了解当查询存储中不存在的键时,Substrate将返回0或null值。它对选项类型有特殊之处吗?

我问,因为在默认的节点模板中,存储项Something被声明为

Something: Option<u32>;

但是稍后在do_something设置器中,方法签名声明了something: u32,但是直接传递了它而不将其包装在Some()中:

Something::put(something);

代替

Something::put(Some(something));

如果Substrate将存储T的调用解释为存储Some<T>,这是否还意味着如果我将None存储在映射中的键上,那么它将删除该键吗?它存储Some(T)还是T

还是Rust正在为Something::put(some: T)Something::put(some: Option<T>)的情况构建专门的方法调用?

1 个答案:

答案 0 :(得分:1)

实际上,decl_storage的扩展名是否为Option都不同。

实现的特征是srml_support::storage::StorageValue

  • 如果值是Option<MyType>,则实现的特征是
srml_support::storage::StorageValue<MyType> {
    type Query = Option<MyType>;
}
如果在该存储使用的键的Trie中找不到值,则实现get中的

将返回None。

  • 如果值不是选项,而是其他任何类型MyType,则实现的特征是
srml_support::storage::StorageValue<MyType> {
    type Query = MyType;
}
如果在该存储使用的键的Trie中找不到值,则实现get中的

将返回Default。

请注意,可以使用以下语法覆盖此默认设置:

NotOptionSomething: u32 = MyDifferentDefault;
  

如果Substrate将存储T的调用解释为存储Some,这是否还意味着如果我针对某个键在映射中存储None,那么它将删除该键?是存储Some(T)还是T?

在这一点上,这不再是基材的解释,而只是防锈特性的实现。 put函数被实现为将编码的值存储在trie中。没有包装在选项中。