srml_support::storage::StorageMap中get()和take()有什么区别
In srml_support::storage::StorageMap, what is the difference between get() and take()
在srml_support::storage::StorageMap中,fn get()
和fn take()
有什么区别?
get()
只需 returns 存储中的值:
/// Load the bytes of a key from storage. Can panic if the type is incorrect.
fn get<T: codec::Decode>(&self, key: &[u8]) -> Option<T>;
take()
既执行 get()
到 return 值,也执行 kill()
从存储中删除密钥:
/// Take a value from storage, deleting it after reading.
fn take<T: codec::Decode>(&mut self, key: &[u8]) -> Option<T> {
let value = self.get(key);
self.kill(key);
value
}
这意味着在 take()
操作之后,您可以调用 exists()
并且它将 return false
.
使用 take()
的常见模式是某种彩池支付。假设在某场比赛结束时,获胜者获得了底池中的所有资金。您可以对底池值调用 take()
以获取应该转移给用户的金额,并将底池重置为 "zero".
请注意,此操作确实会写入存储,因此在您的运行时调用时,存储会被永久修改。
在srml_support::storage::StorageMap中,fn get()
和fn take()
有什么区别?
get()
只需 returns 存储中的值:
/// Load the bytes of a key from storage. Can panic if the type is incorrect.
fn get<T: codec::Decode>(&self, key: &[u8]) -> Option<T>;
take()
既执行 get()
到 return 值,也执行 kill()
从存储中删除密钥:
/// Take a value from storage, deleting it after reading.
fn take<T: codec::Decode>(&mut self, key: &[u8]) -> Option<T> {
let value = self.get(key);
self.kill(key);
value
}
这意味着在 take()
操作之后,您可以调用 exists()
并且它将 return false
.
使用 take()
的常见模式是某种彩池支付。假设在某场比赛结束时,获胜者获得了底池中的所有资金。您可以对底池值调用 take()
以获取应该转移给用户的金额,并将底池重置为 "zero".
请注意,此操作确实会写入存储,因此在您的运行时调用时,存储会被永久修改。