关于语言进化的小品文:发现一种古老语法特征的历史

主要观点:作者在研究 Ruby 语言历史时,意外发现 Ruby 1.9.1 引入了可在可选参数后定义必选参数的语法特性,通过查看代码和相关讨论,探究了其引入原因、使用场景及与其他语言的对比。
关键信息

  • Ruby 1.9.1 引入可在可选参数后定义必选参数的特性,行为简单可预测,如def foo(optional = -100, mandatory)
  • 此特性的引入源于 Ruby 1.9 中更普遍的变化,即允许在可变数量参数后有单个参数(必选或可选),如handle_files(*extensions, handler)
  • 该特性在 Ruby 核心 API 中有一些应用,如TCPServer#initialize([hostname,] port)exec([env, ] command_line, options = {})
  • 与其他语言对比,PHP 曾有此设计缺陷后在 8.0 版弃用,JS 需显式传undefined,Python、Kotlin、Scala 允许其他必选参数在可选或解包参数之后但需按名传递, newer 语言如 Rust、Zig、Nim、Go 选择不允许可选参数,而是使用参数结构体。
    重要细节
  • parse.y中可找到相关语法定义,通过git blame可找到引入该特性的提交及对应的邮件讨论。
  • 此特性在方法定义中可用,也在变量赋值等场景中可用,如*folders, filename = '/home/zverok/blog/_posts/optional-args.md'.split('/')
  • 还有如Multidimensional类中重定义索引赋值运算符的有趣 API,展示了“最后必选参数”的意义。
  • 作者提到自己虽难以想起用此特性实现的 API,但认为其可能有使用场景,且展示了设计的演变及与其他语言的差异,希望读者喜欢此内容,并呼吁支持乌克兰。
阅读 9
0 条评论