“无用的 Ruby 语法糖”:参数转发
Ruby 新的参数转发语法 `...` 让开发者分成两派:一派认为它是优雅、低维护的语法糖,适合包装和委托方法;另一派则认为它是不必要的复杂度,会损害可读性。讨论进一步扩展到对 Ruby 整体设计的批评——包括多种调用约定、blocks,以及不断演进的语法——并与 JavaScript、Python、Go、Clojure 等语言进行对比,牵涉到对简单性、“魔法”以及一门成熟语言应当继续增加多少语法的更深层问题。几位评论者也提到可选静态类型和类型系统(例如 Sorbet、TypeScript),认为它们是提升健壮性的另一条路径,而不是新增语法特性。
对文章和这一特性的总体反响
- 许多评论者喜欢这个系列,并认为参数转发的
...语法优雅、表达力强,而且对真实世界里的 Ruby(例如 Rails 服务对象)很有帮助。 - 也有人觉得这种新语法糖难看、令人困惑,或者“无用”,尤其是从较旧的 Ruby 版本过来,或偏好最小化、显式语法的人。
省略号 ... 与“代码已省略”惯例
- 一些人指出困惑之处在于,
...既是有效的 Ruby 语法,又常被用作“代码已省略”的约定。 - 人们提出了各种替代方案:
- 使用带空格的
. . .、注释,或像[..trim..]这样的文本标记。 - 依赖 Rust 的
todo!或 Python 的...这类语言特性作为占位符。
- 使用带空格的
- 还有人提到,多种语言本来就把
...用于可变参数/展开,所以有人认为 Ruby 并没有破坏任何“行业标准”。
Ruby 的参数与 block 模型
- 解释说明了 Ruby 有:
- 位置参数和关键字参数,以及一个可选的 block。
- 关于 hash 与关键字参数的历史怪癖,这些在 Ruby 3 中已得到整理。
- 讨论了 blocks、procs 与 lambdas:
- blocks 是带有特殊返回语义的隐式闭包。
- procs/lambdas 是显式的可调用对象,控制流行为不同。
- 有人认为这三种“类函数”抽象过于复杂;也有人认为一旦学会,它们既强大又直观。
设计质量:Ruby 与其他语言
- 一方认为,Ruby 的多种调用约定和语法糖表明其设计有缺陷,或者相比更简单的模型显得臃肿(例如像 JavaScript 那样“直接传对象和函数”)。
- 另一方观点则是:
- Ruby 的语法和语义被认为经过深思熟虑,而且可读性很高。
- 同一时代的许多语言都做过别扭的选择;Ruby 并非独一无二地糟糕。
- Ruby 提供了很高的上限,可以写出优雅的 DSL 风格代码,但也有很低的下限,容易写出不可读的“魔法”。
静态类型与大型系统
- 有人认为 Ruby 应优先支持可选静态类型;也有人主张在一门语言里同时存在两套类型系统并不是好的工程实践。
- TypeScript 和 Python 的类型标注被视为成功案例;Sorbet 和其他 Ruby 类型工具被认为有帮助,但能力较弱。
- 关于静态类型是否对大型、长期维护的系统至关重要,还是一种被过度重视、反馈较慢的实践,双方存在激烈分歧。