首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么ruby不支持方法重载?

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

Stack Overflow用户
提问于 2012-02-21 14:22:50
回答 5查看 51K关注 0票数 151

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

EN

回答 5

Stack Overflow用户

发布于 2012-02-21 14:31:17

我假设你正在寻找这样做的能力:

代码语言:javascript
复制
def my_method(arg1)
..
end

def my_method(arg1, arg2)
..
end

Ruby以不同的方式支持这一点:

代码语言:javascript
复制
def my_method(*args)
  if args.length == 1
    #method 1
  else
    #method 2
  end
end

一种常见的模式也是将选项作为散列传递:

代码语言:javascript
复制
def my_method(options)
    if options[:arg1] and options[:arg2]
      #method 2
    elsif options[:arg1]
      #method 1
    end
end

my_method arg1: 'hello', arg2: 'world'

希望这能有所帮助

票数 88
EN

Stack Overflow用户

发布于 2012-02-21 14:32:11

方法重载在具有静态类型的语言中很有意义,您可以区分不同类型的参数

代码语言:javascript
复制
f(1)
f('foo')
f(true)

以及不同数量的参数之间

代码语言:javascript
复制
f(1)
f(1, 'foo')
f(1, 'foo', true)

第一个区别在ruby中不存在。Ruby使用动态类型或“鸭子类型”。第二个区别可以通过默认参数或使用参数来处理:

代码语言:javascript
复制
def f(n, s = 'foo', flux_compensator = true)
   ...
end


def f(*args)
  case args.size
  when  
     ...
  when 2
    ...
  when 3
    ...
  end
end
票数 9
EN

Stack Overflow用户

发布于 2015-03-19 05:29:02

这并没有回答为什么ruby没有方法重载的问题,但是第三方库可以提供它。

contracts.ruby库允许重载。改编自本教程的示例:

代码语言:javascript
复制
class Factorial
  include Contracts

  Contract 1 => 1
  def fact(x)
    x
  end

  Contract Num => Num
  def fact(x)
    x * fact(x - 1)
  end
end

# try it out
Factorial.new.fact(5)  # => 120

请注意,这实际上比Java的重载更强大,因为您可以指定要匹配的值(例如1),而不仅仅是类型。

但是,您将看到使用此方法的性能下降;您将不得不运行基准测试来确定您可以容忍多少。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9373104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档