关于ruby:通过重载可以做多态吗?

Is it possible to do polymorphism by doing overloading?

本问题已经有最佳答案,请猛点这里访问。

我正在尝试执行以下操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
class SUM
  def make_sum (number)
    return number+number
  end

  def make_sum (number_a, number_b)
    return number_a+number_b
  end
end

operation = SUM.new
operation.make_sum(5)    # returns 10
operation.make_sum(2, 3) # returns 5

一个输入的make和方法由两个输入的make和方法重新定义。


如果添加的是您想要的,您可以更简单地做到:

1
2
3
4
5
6
def add(*numbers)
  numbers.inject(&:+)
end

add(1) # => 1
add(1, 3, 5) # => 9

如果您正在寻找一个更通用的解决方案来解决如何根据参数数量提供行为的问题,那么在签名中使用*args,然后根据args.size进行分支:

1
2
3
4
5
6
7
8
9
10
def foo(*args)
   case args.size
     when 1
        # do something
     when 2
        # do something else
     when (3..5)
        # do another thing
   end
 end


我和@keith bennett有同样的反应。但我不知道这和他的回答一样简单。我的解决方案是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Foo
  def self.add(*args)
      r = 0
      if args.length > 1
          args.each { |a| r += a.to_i }
      else
          r += (args[0].to_i + args[0].to_i)
      end
      return r
  end
end

f = Foo
puts f.add(1, 2)
# => 3
puts f.add(1)
# => 2