Ruby不支持方法重载,而是覆盖现有的方法。有人能解释一下为什么这种语言是这样设计的吗?
发布于 2012-02-21 14:31:17
我假设你正在寻找这样做的能力:
def my_method(arg1)
..
end
def my_method(arg1, arg2)
..
end
Ruby以不同的方式支持这一点:
def my_method(*args)
if args.length == 1
#method 1
else
#method 2
end
end
一种常见的模式也是将选项作为散列传递:
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'
希望这能有所帮助
发布于 2012-02-21 14:32:11
方法重载在具有静态类型的语言中很有意义,您可以区分不同类型的参数
f(1)
f('foo')
f(true)
以及不同数量的参数之间
f(1)
f(1, 'foo')
f(1, 'foo', true)
第一个区别在ruby中不存在。Ruby使用动态类型或“鸭子类型”。第二个区别可以通过默认参数或使用参数来处理:
def f(n, s = 'foo', flux_compensator = true)
...
end
def f(*args)
case args.size
when
...
when 2
...
when 3
...
end
end
发布于 2015-03-19 05:29:02
这并没有回答为什么ruby没有方法重载的问题,但是第三方库可以提供它。
contracts.ruby库允许重载。改编自本教程的示例:
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
),而不仅仅是类型。
但是,您将看到使用此方法的性能下降;您将不得不运行基准测试来确定您可以容忍多少。
https://stackoverflow.com/questions/9373104
复制相似问题