主要观点:作者在研究 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,但认为其可能有使用场景,且展示了设计的演变及与其他语言的差异,希望读者喜欢此内容,并呼吁支持乌克兰。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。