总结

不同的对象组合方法

  1. 对象包装

    • 将对象存储在另一个对象中(例如,将 SuiFren 存储在 GiftBox 中)。这会将被包装的对象(SuiFren)从全局存储中移除。链外的 Web 界面在包装后无法查找它们。对象不再有任何所有者。你可以将其视为将对象转换为普通的非对象结构体实例。
  2. 动态字段

    • 可以理解为未在对象结构体中显式定义的隐藏字段。
    • 也可以用于存储对象。这也会将对象从全局存储中移除,所有权也会被移除。这与对象包装非常相似,只不过字段是动态添加的,而不是在结构体中显式定义的。
    • 要向对象添加动态字段,你需要该对象的可变引用。可以通过 dynamic_field::add 方法,使用可变对象的 id、键和值来添加动态字段。
    • 要读取或修改动态字段,你需要对象的不可变引用和可变引用以及字段名(键)。如果字段名是一个结构体,你需要该结构体的值,这就是为什么用作键的结构体必须具有 copy 和 drop 能力的原因。
    • 动态对象字段比动态字段更适合用于动态存储对象。只有在有意想要将对象从全局存储中移除时,才应使用动态字段。
  3. 动态对象字段

    • 不会将对象从全局存储中移除。所有权会转移到一个特殊的“动态字段对象”,对于 Web 界面来说通常不容易查找。在大多数情况下,这几乎与放弃对象的所有权有相同的效果。
  4. 对象拥有其他对象

    • 完美的用例是可组合的NFT。这允许将多个NFT强有力地组合在一起,使其对用户而言自然合理,这在使用NFT的 Web 3 游戏中经常见到。
    • 适用于复杂应用设计中有明确对象层次结构的情况,其中包含多种类型的对象。
    • 其缺点是以后很难移除被拥有的对象。因此,如果关系很少或从未改变,对象拥有对象通常更有用。

有趣的对象数据结构:

  • 对象袋(Object Bag):一种多功能的数据结构,用于存储不同类型对象的混合集合——适用于需要灵活和多样化对象组合的应用,如随机或组合NFT。
  • 对象表(Object Table):一种用于存储单一对象类型集合的数据结构,并具有特定的键名——对需要结构化和命名相似对象集合的应用有益。