我正在将一些代码从其他语言移植到Ruby,在我的类中我需要保持与这4个构造函数的兼容性:
def initialize(b)
def initialize(a, b)
def initialize(b, c)
def initialize(a, b, c)
我正在尝试这种方式,但它不起作用:
def initialize(a="", b, c="")
有智能解决方案吗?我不能使用哈希。
答案 0 :(得分:2)
如果你不能使用哈希(为什么不呢?),并且他们必须是initialize
方法,你可能会运气不好。没有输入或位置信息,就没有办法去构造一个数组,并确定哪个参数是哪个。
IMO最干净的是提供构造方法的类方法,并接受特定于构造函数的参数(在本例中为工厂)。
如果参数是不同类型的,你可以使用这些信息来确定传入哪些值,我猜想,但IMO非常难看。
答案 1 :(得分:2)
如果a,b,c
是完全不同的类型,并且总是如此,则可能是这样的:
def initialize(*args)
args.each do |arg|
do_a if arg.is_a?(first_type)
do_b if arg.is_a?(second_type)
do_c if arg.is_a?(third_type)
end
end
我承认,它不漂亮,但应该有效。
如果您只想要3个参数,请将each
限制为仅运行3.times
。
答案 2 :(得分:0)
这可能是一个解决方案,但它很难看!
def initialize(*args)
case (args.length)
when 1
super(XXX)
@y = args[0]
when 2
if args[0].kind_of?(A) then
super(args[0])
@x = args[0]
@y = args[1]
elsif args[0].kind_of?(B) then
super(XXX)
@y = args[0]
@z = args[1]
end
when 3
super(args[0])
@x = args[0]
@y = args[1]
@z = args[2]
end
end