在 Zig 中使用编译时进行标记联合子集

主要观点:Zig 支持标记联合,编译器在switch标记联合时若未处理所有可能情况会报错,这有助于避免添加新情况时的错误,但有时需要处理标记联合的子集。文中以Ghostty 终端项目的键绑定动作为例,展示了如何使用 Zig 的comptime优雅地解决该问题。
关键信息:

  • Zig 标记联合及编译器处理规则。
  • Ghostty 中键绑定动作的标记联合表示及performAction函数。
  • 引入Scope函数确定动作范围,使用comptime创建子集类型ScopedAction
  • 实现将Action转换为特定范围的子集类型的函数scoped及其原理。
    重要细节:
  • Action联合包含多种动作,多数无数据关联,部分有i16数据。
  • 最初处理应用范围动作时使用else和列举所有不关心的动作的方式,存在问题。
  • ScopedAction函数通过遍历Action的字段,筛选出特定范围的字段来创建子集类型。
  • scoped函数在运行时通过switch语句过滤出属于特定范围的动作,可能有少量运行时成本但编译器会优化。
    结论:Zig 的comptime功能强大,可用于解决实际问题,文中展示了其高级用法,作者认为 Zig 在类型系统和开发效率之间取得了良好平衡。
阅读 15
0 条评论