为什么ruby不支持method重载?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (31)

Ruby不支持重载method,而是覆盖现有method。有谁能解释为什么这种语言是这样设计的呢?

提问于
用户回答回答于

方法重载可以通过声明两个具有相同名称和不同签名的方法来实现。这些不同的签名可以是,

  1. 具有不同数据类型的参数,例如: method(int a, int b) vs method(String a, String b)
  2. 可变数量的参数,例如: method(a) vs method(a, b)

def method(a); end;
def method(a, b = true); end; # second argument has a default value

method(10)
# Now the method call can match the first one as well as the second one, 
# so here is the problem.

所以ruby需要在方法查找链中维护一个具有唯一名称的方法。

用户回答回答于

“重载”这个词在Ruby中根本就没有意义。它基本上是“基于静态参数的分派”的同义词,但是Ruby没有。有静态调度完全因此,Ruby不支持基于参数的静态调度的原因是因为它不支持静态调度,周期。它不支持什么都爱看,无论是基于论点还是其他。

现在,如果你是不其实是专门问超载的问题,但也许是关于动态基于参数的分派,那么答案是:因为Matz没有实现它。因为没人愿意提出这个建议。因为没有其他人费心去实现它。

通常,在具有可选参数和可变长度参数列表的语言中,基于动态参数的分派是非常很难纠正,甚至更难让它可以理解。即使在语言中静态如果没有可选的参数(例如Java),基于参数的分派,有时几乎不可能对一个凡人来说,哪种超载会被挑出来的。

在C#中,实际上可以对任何3-SAT问题转化为过载分解,这意味着C#中的过载解析是NP-硬的.

现在试试动态调度,在那里你有额外的时间维度来保持在你的头脑中。

有些语言基于过程的所有参数进行动态分派,而不是面向对象的语言,后者只在“隐藏”零上进行分派。self争论。例如,通用Lisp会分发所有参数的动态类型,甚至是动态值。Clojure对所有参数的任意函数进行分派(非常酷,功能非常强大)。

扫码关注云+社区