在srml_support::storage::StorageMap中,fn get()
和fn take()
有什么区别?
答案 0 :(得分:2)
get()
仅返回存储中的值:
/// 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()
来返回值,又执行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()
,它将返回false
。
使用take()
的常见模式是某种底池支付。假设在比赛结束时,获胜者将所有资金存入彩池。您可以在底池值上调用take()
,以获取应该转移到用户的金额,并将底池重置为“零”。
请注意,此操作确实会写入存储,因此在运行时中调用时,存储将被永久修改。