AccountId 元组和ink_storage::collections::Vec 的HashMap

问题描述

我想用墨水创建一个 HashMap 存储项!

#[ink(storage)]
pub struct item {
    shipment: ink_storage::collections::HashMap<
        (AccountId,AccountId),ink_storage::collections::Vec<u128>,>,}

并初始化它:

#[ink(constructor)]
pub fn new() -> Self {
    Self {
        shipment: ink_storage::collections::HashMap::new(),}
}

我遇到了这个错误信息

特征 PackedLayout 未实现 `ink_storage::Vec

解决方法

ink_storage::Vec 没有实现 PackedLayout 因为它的布局没有打包!根据{{​​3}}:

尽管与 Rust 的 Vec 类型相似,但此存储 Vec 在其内部数据布局上有许多不同。虽然它将数据存储在连续的存储槽中,但这并不意味着数据实际上密集地存储在内存中。

数据被组织成连续的块,但每个块可能不与内存中的前一块相邻。

另一方面,std::vec::Vec 确实实现了PackedLayout,因此您应该可以使用它。