我们可以在Ruby中一次调用普通构造函数和参量构造函数吗?

时间:2019-02-26 04:07:48

标签: ruby

我尝试过这样。 ClassA的文件名为instanceAndClassMethods

class ClassA

    def initialize #constructor 
        puts "This is my constructor" 
    end

    def initialize(a,b)
        c=a-b
        puts c
    end
end

在其他班级,我都叫上述班级,因为它们都位于同一文件夹中,例如:

require './instanceAndClassMethods' #filename不应包含空格

obj = ClassA.new #constructor在创建对象时自动调用

obj=ClassA.new(33,33)

从命令提示符运行时,我得到:

Traceback (most recent call last):
        2: from callMeth.rb:4:in `<main>'
        1: from callMeth.rb:4:in `new'
C:/Users/vkuma102/Desktop/Ruby Learning/instanceAndClassMethods.rb:7:in `initial
ize': wrong number of arguments (given 0, expected 2) (ArgumentError)

如果是这种情况,那就很难了,而我们可以在Java中调用常规构造函数和带有参数的构造函数

3 个答案:

答案 0 :(得分:7)

否,Ruby没有方法重载。与例如Java或Crystal,每个类只能得到一个同名的方法。您的第二个def将覆盖第一个。就像写foo = 7; foo = 19一样-无法从7访问值foo

如果要区分不同的参数列表,则需要自己执行。幸运的是,与Java不同,Ruby具有可选参数(即具有默认值的参数):

class ClassA
  def initialize(a=nil, b=nil)
    if a && b
      c = a - b
      puts c
    else
      puts "This is my constructor" 
    end
  end
end

答案 1 :(得分:1)

除了Amadan建议的 overloading 解决方案外,您还可以提供工厂方法来补充构造函数,例如:

class Foo

  def initialize(_a = nil, _b = nil, _c = _nil)
    @a, @b, @c = _a, _b, _c
  end

  # factories
  def self.make_fancy_foo(x,y,z)
    new(bar(x),y+1,baz(z-y))
  end
  def self.make_special_foo(x)
    new(x,x,x)
  end

end

这是您如何使用它们:

foo1 = Foo.new
foo2 = Foo.new(88)
foo3 = Foo.new(3,6,9)
foo4 = Foo.make_fancy_foo(7,-1,5)
foo5 = Foo.make_special_foo(6)

答案 2 :(得分:0)

您正在覆盖第一个构造函数,在ruby中每个名称只能有一个方法,要实现所需的行为,您可以执行以下操作:

class ClassA
  def initialize(a=nil, b=nil)
    a && b ? puts(a+b) : puts "This is my constructor" 
  end
end

或者:

class ClassA
  def initialize(*args)
    arg.any? ? deal_with_params : puts "This is my constructor" 
  end
end