第十二章 · 实战练习
以下任务与 章索引 · 建议阅读路线 中的阶段 A~E 对应,可按兴趣选做。
实战一:事件里加字段(阶段 B)
- 进入
src/12_programmability/code/programmability_lab/。 - 在事件 struct 中增加一个字段(如
sender: address或tick: u8),同步修改emit调用处。 sui move build(及测试若存在)。- 验收:编译通过;能说明为何事件类型需要
copy + drop,并对照 §12.1 中event在框架中的位置。
实战二:init 与一次性逻辑(阶段 A)
- 参考
src/13_patterns/code/patterns_lab/中的fun init(第十一与十二章交界,可对照阅读)。 - 在
programmability_lab或副本包中,为模块添加init,只做一件事(如发一个AdminCap给部署者)。 - 验收:
sui move test或本地构建通过;能解释init何时运行一次、升级时为何不再次运行。
实战三:Clock 只读调用(阶段 C)
- 阅读 §12.5 · Epoch 与时间 与
src/22_advanced_topics/code/advanced_lab/sources/clock_probe.move(若仓库中有)。 - 写一段 PTB 伪代码(不必上链):传入共享
Clock,调用timestamp_ms读时间,再moveCall你的业务函数。 - 验收:步骤顺序合理(
Clock作为共享对象传入);能区分ctx.epoch()与Clock::timestamp_ms的精度差异。
实战四:VecMap 与 Table 二选一(阶段 D)
- 设计一个「地址 → 积分」映射:条目数可能从几十增长到上万。
- 分别说明:若用
VecMap会有什么问题;若用Table优势在哪(对照 §12.1 集合表与 §12.6、§12.10)。 - 验收:书面回答即可,无需长代码。
实战五:框架地图自测(全章)
- 打开 §12.1,遮住「集合选型」表,在纸上默写
VecMap/Table/ObjectTable/Bag四类在「键同质、值是否对象、数据住哪」上的区别。 - 验收:能口述无误后再回到表格核对。