主要观点:Zig 支持标记联合,编译器在switch
标记联合时若未处理所有可能情况会报错,这有助于避免添加新情况时的错误,但有时需要处理标记联合的子集。文中以Ghostty 终端项目的键绑定动作为例,展示了如何使用 Zig 的comptime
优雅地解决该问题。
关键信息:
- Zig 标记联合及编译器处理规则。
- Ghostty 中键绑定动作的标记联合表示及
performAction
函数。 - 引入
Scope
函数确定动作范围,使用comptime
创建子集类型ScopedAction
。 - 实现将
Action
转换为特定范围的子集类型的函数scoped
及其原理。
重要细节: Action
联合包含多种动作,多数无数据关联,部分有i16
数据。- 最初处理应用范围动作时使用
else
和列举所有不关心的动作的方式,存在问题。 ScopedAction
函数通过遍历Action
的字段,筛选出特定范围的字段来创建子集类型。scoped
函数在运行时通过switch
语句过滤出属于特定范围的动作,可能有少量运行时成本但编译器会优化。
结论:Zig 的comptime
功能强大,可用于解决实际问题,文中展示了其高级用法,作者认为 Zig 在类型系统和开发效率之间取得了良好平衡。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。