动态字段 - 存储城堡数据
Move 提供了一项独特的功能,允许在 Sui 对象初始构建后添加字段,这超出了类型定义中声明的字段的预定义结构的限制。动态字段具有在运行时添加或删除字段的能力。
有两种类型的动态字段:
- 动态字段
- 动态对象字段
动态字段
sui::dynamic_field
可以向具有 field id: UID
的 Sui 对象添加任何具有 store
能力的值。
为了说明其用法,让我们深入探讨 Move Castle 游戏的 Game Store
组件。
由于在 Sui 中对象可见性的考虑(将在后续课程中介绍),将每个城堡的某些游戏数据存储在城堡对象中是不切实际的。
这尤其与战斗机制有关,因为战斗机制会影响双方城堡的状态。因此,需要一个集中存储库来存储共享的游戏数据。
在 core.move
中,我们添加一个 GameStore
结构体:
/// 持有游戏信息
public struct GameStore has key, store {
id: UID,
small_castle_count: u64, // 小型城堡数量限制
middle_castle_count: u64, // 中型城堡数量限制
big_castle_count: u64, // 大型城堡数量限制
castle_ids: vector<ID>, // 存储所有城堡对象 ID
}
我们将在未来的课程中将 GameStore
对象发布为共享对象。
在创建城堡对象时,我们需要将城堡游戏数据作为动态字段添加到游戏存储中:
let castle_data = CastleData {...}; // 省略城堡数据构建
dynamic_field::add(&mut game_store.id, castle_object_id, castle_data);
在这种情况下,动态字段的键是城堡对象的 ID,字段值是城堡数据。
要检索城堡数据,可以使用以下代码:
let castle_data = dynamic_field::borrow_mut<ID, CastleData>(&mut game_store.id, castle_object_id);
(使用动态字段存储城堡数据仅用于教学目的,并不是存储城堡数据的基本方法。)
动态对象字段
类似于动态字段,sui::dynamic_object_field
要求字段值必须是 Sui 对象。这意味着动态对象字段值必须具有 key
和 store
能力。
对动态对象字段的操作与动态字段类似。主要区别在于,动态对象字段值是具有 id: UID
字段的 Sui 对象。
要获得更全面的理解和详细示例,请参阅以下介绍:Move 中的动态对象字段。