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".

请注意,此操作确实会写入存储,因此在您的运行时调用时,存储会被永久修改。