我了解当查询存储中不存在的键时,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>)
的情况构建专门的方法调用?
答案 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中。没有包装在选项中。