我尝试过这样。 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中调用常规构造函数和带有参数的构造函数
答案 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