Ruby中的方法重载
什么是方法重载?
方法重载是一项功能,它允许一个类具有多个具有相同名称但方法签名不同的方法,即。不同数量的参数,参数的顺序和不同类型的参数。返回类型不包含在方法签名中,因此重载的方法可以具有不同的返回类型。方法重载是静态绑定或编译时多态性的一个例子。
Ruby 不支持方法重载
方法重载是静态类型语言的一个特性,其中方法的绑定发生在编译时。但是 Ruby 是一种动态类型语言,它根本不支持静态绑定。此外,在具有可选参数和可变长度参数列表的语言中,在基于动态参数的调度的情况下,很难确定将调用哪个方法。另外,Ruby 的实现语言是 C,它本身不支持方法重载。考虑该方法的最新版本,而忽略该方法的先前定义的版本。
下面的示例显示 Ruby 不支持通常的方法重载方法
示例 #1:
class Test
def self.sum(a,b)
puts(a+b)
end
def self.sum(a,b,c)
puts(a+b+c)
end
end
Test.sum(1,2)
输出:
main.rb:13:in `sum': wrong number of arguments (2 for 3) (ArgumentError)
from main.rb:18:in `'
在 Ruby 中,当使用相同名称定义第二个方法时,它会完全覆盖先前存在的方法。以前的方法不再可访问,因此当我们尝试访问它时会引发错误。
示例 #2:
class Test
def self.sum(a,b)
puts(a+b)
end
def self.sum(a,b,c)
puts(a+b+c)
end
end
Test.sum(1,2,7)
输出:
10
第二种方法覆盖了前一种方法,因此当我们使用三个参数调用该方法时它工作得非常好。在 Ruby 中实现方法重载
在 Ruby 中实现重载的一种可能方法是改变方法的参数数量。然而,使用不同类型的参数重载方法是可能的,但是跟踪代码变得非常困难。两种方法都在下面演示:
通过改变参数的数量来重载方法
- 使用类方法
例子 :class Test def self.display(*args) case args.size when 1 puts "1: Hello #{args[0]}" when 2 puts "2: Hello #{args[0]} #{args[1]}" when 3 puts "3: Hello #{args[0]} #{args[1]} Welcome to #{args[2]} language." end end end puts "Overloading using Class Method" Test.display"Geeks!!" Test.display"Geeks!!", "Hope you doing great." Test.display"Geeks!!", "Hope you doing great.", "Ruby"
输出
Overloading using Class Method 1: Hello Geeks!! 2: Hello Geeks!! Hope you doing great. 3: Hello Geeks!! Hope you doing great. Welcome to Ruby language.
display()方法是一个类方法。在 Ruby 中,类方法为类本身提供功能。因此,我们直接使用类名后跟点运算符和方法名来调用方法。默认情况下,类方法是公共的。
- 使用实例方法
例子 :class Test def display(*args) case args.size when 1 puts "1: Hello #{args[0]}" when 2 puts "2: Hello #{args[0]} #{args[1]}" when 3 puts "3: Hello #{args[0]} #{args[1]} Welcome to #{args[2]} language." end end end ob1 = Test.new ob2 = Test.new ob3 = Test.new puts "Overloading using Instance Method" ob1.display"Geeks!!" ob2.display"Geeks!!", "Hope you doing great." ob3.display"Geeks!!", "Hope you doing great.", "Ruby"
输出
Overloading using Instance Method 1: Hello Geeks!! 2: Hello Geeks!! Hope you doing great. 3: Hello Geeks!! Hope you doing great. Welcome to Ruby language.
实例方法display()为类的实例提供功能。我们需要创建类的实例来调用类的实例方法。不能使用类名直接调用实例方法。
- 通过改变参数数量和参数类型的方法重载
例子 :def sum(*args) case args.size when 2 if args[0].is_a?(Integer) && args[1].is_a?(Integer) puts "Int addition: #{args[0].to_i + args[1].to_i}" elsif args[0].is_a?(Integer) && args[1].is_a?(Float) puts "Int and Float addition: #{args[0].to_i + args[1].to_f}" elsif args[0].is_a?(Float) && args[1].is_a?(Integer) puts "Float and Int addition: #{args[0].to_f + args[1].to_i}" end when 3 if args[0].is_a?(Integer) && args[1].is_a?(Integer) && args[2].is_a?(Integer) puts "Int addition: #{args[0].to_i + args[1].to_i + args[2].to_i}" elsif args[0].is_a?(Integer) && args[1].is_a?(Float) && args[2].is_a?(Integer) puts "Int, Float and Int addition: #{args[0].to_i + args[1].to_f + args[2].to_i}" elsif args[0].is_a?(Float) && args[1].is_a?(Integer) && args[2].is_a?(Float) puts "Float, Int, Float addition: #{args[0].to_f + args[1].to_i + args[2].to_f}" end end end sum 5, 7 sum 2.0, 6 sum 4, 5.2 sum 2, 3, 5 sum 4.5, 5, 3.5 sum 1, 2.5, 3
输出
Int addition: 12 Float and Int addition: 8.0 Int and Float addition: 9.2 Int addition: 10 Float, Int, Float addition: 13.0 Int, Float and Int addition: 6.5
随着参数数量的增加,代码变得复杂。但是,我们可以不断增加案例的数量来处理不同数量的参数。