📜  Ruby中的方法重载

📅  最后修改于: 2022-05-13 01:54:58.365000             🧑  作者: Mango

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
    

    随着参数数量的增加,代码变得复杂。但是,我们可以不断增加案例的数量来处理不同数量的参数。