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/