ruby - 为什么 ruby​​ 不支持方法重载?

标签 ruby

Ruby 不支持方法重载,而是覆盖现有方法。谁能解释一下为什么要这样设计语言?

最佳答案

“重载”这个术语在 Ruby 中根本就没有意义。它基本上是“基于静态参数的分派(dispatch)”的同义词,但 Ruby 根本没有静态分派(dispatch)。所以,Ruby 之所以不支持基于参数的静态分派(dispatch),是因为它不支持静态分派(dispatch),句号。它不支持任何类型的静态分派(dispatch),无论是基于参数还是其他方式。

现在,如果您不是实际上专门询问过载,但可能是关于动态基于参数的调度,那么答案是:因为 Matz 没有实现它.因为没有其他人费心提出它。因为没有其他人费心实现它。

通常,在具有可选参数和可变长度参数列表的语言中,基于动态参数的调度非常很难正确,甚至更难保持这是可以理解的。即使在具有静态基于参数的分派(dispatch)且没有可选参数的语言中(例如 Java),有时几乎不可能告诉凡人,哪个重载是将被选中。

在 C# 中,您实际上可以将任何 3-SAT 问题编码为重载解析,这意味着 C# 中的重载解析是 NP-hard。

现在尝试使用动态调度,您可以在其中保留额外的时间维度。

有些语言会根据过程的所有参数进行动态调度,这与面向对象的语言相反,后者仅在“隐藏的”第零个 self 参数上进行调度。例如,Common Lisp 调度动态类型,甚至调度所有参数的动态值。 Clojure 调度所有参数的任意函数(顺便说一句,这非常酷而且非常强大)。

但我不知道有任何 OO 语言具有基于动态参数的分派(dispatch)。 Martin Odersky 说他可能考虑向 Scala 添加基于参数的分派(dispatch),但只有他可以同时移除重载是倒退的- 与使用重载的现有 Scala 代码兼容并与 Java 兼容(他特别提到了 Swing 和 AWT,它们发挥了一些极其复杂的技巧,几乎运用了 Java 相当复杂的重载规则的每一个令人讨厌的黑暗角落案例)。我自己有一些关于向 Ruby 添加基于参数的分派(dispatch)的想法,但我一直想不出如何以向后兼容的方式来实现它。

关于ruby - 为什么 ruby​​ 不支持方法重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9373104/

相关文章:

ruby - 为什么在 ruby​​ 救援 block 中调用的函数无法修改变量?

ruby 、Feedzirra、斑疹伤寒

html - 带有必填字段的 Rails 下拉菜单

ruby-on-rails - 如何格式化 Axlsx 中的货币列?

ruby - 安装 travis-cli 时在 macOS 中找不到 libffi 的包配置

arrays - 无法将枚举器转换为数组

ruby-on-rails - Ruby - 编写一个基本的 Controller

ruby - 如何使用 rspec 测试 CLI 的标准输入

ruby-on-rails - 由 Yard 和西类牙口音生成的文档

ruby-on-rails - 在 Rails 3.2 + SimpleForm 中显示带有嵌套表单错误的字段