Zig 风格的泛型对于大多数语言来说并不太适用。

主要观点:Zig 的泛型编译方案与 C++有很多相似之处,也有类似的陷阱,这种方案不适合所有语言,对其他语言应如何采用 Zig 风格泛型的空想建议是错误的。
关键信息

  • Zig 泛型更像模板,调用时易出现深层类型错误,写代码时需考虑更多,编译器支持有限,类型推断受限,不能分发二进制库,工具需做更多工作,无法支持编译时非确定性和多态递归。
  • 不同语言在泛型设计上有差异,如 Go 接口、Rust 特质等,Zig 与 D、Circle 类似但更易使用。
  • 很多人认为 Zig 泛型完美应被其他语言借鉴,但实际上各有特点和适用场景。
    重要细节
  • Zig 泛型写函数时无需提前指定操作约束,以类型作为编译时参数,代码示例展示其与其他语言的不同。
  • Zig 缺乏签名中的阶段信息,如 comptime 上下文调用的限制。
  • 模板类错误在 C++中较严重,编译器难以确定错误来源。
  • 写通用代码时,模板需在实例化前进行类型检查,或只写预期实例的测试。
  • 其他语言的类型推断更复杂,能解决未知类型,而 Zig 缺乏约束难以进行有意义的类型表达式评估。
  • 一些语言关心二进制库的通用接口,Zig 无需此约束。
  • IDE 中处理模板代码时,函数体更改需重新检查整个调用图, hover 文档和自动补全效果不佳。
  • 某些语言允许编译时非确定性,但会影响类型系统,Zig 也有相关问题及讨论。
  • 一些语言支持多态递归,但 Zig 因编译时反射等原因无法实现。
阅读 22
0 条评论