Ruby不支持方法重载,而是覆盖现有的方法.有人能解释为什么语言是这样设计的吗?

推荐答案

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

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

我们无法使用第一种方法实现方法重载,因为ruby(dynamic typed language)中没有数据类型声明.因此,定义上述方法的唯一方法是def(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#unionreact 非常奇怪

无法解析音频文件 track1.m4a

回声ABC | ruby -p -e "sub('a','A').sub('b', 'B')": 为什么不是 "ABc"?

在 Ruby 中,rescue语句可以嵌套在哪些 struct 中

ruby 中的魔术注释(#Encoding: utf-8)是如何工作的?

如何修改 Ruby gem

如何通过 Rack 提供静态文件?

如何使用 Ruby 的邮件 gem 通过 smtp 发送Electron邮件?

Ruby 中数组和哈希的性能

Ruby字符串上的扫描和匹配有什么区别

Broken pipe (Errno::EPIPE)

如何在 RSpec 2 中自动加载 spec_helper.rb

我可以使用 `else if` 而不是 `elsif` 吗?

Ruby 1.9 哈希,键中有破折号

在本地覆盖 Vagrant 配置设置(每个开发人员)

如何在 Ruby 中编写复杂的多行 if 条件?

Ruby 疯狂:类与对象?

`gem install therubyracer` 在 Mac OS X Lion 上失败

如何在 Ruby 循环的第一次迭代中采取不同的行动?

def `self.function` 名称是什么意思?