我正在将一些代码从其他语言移植到 Ruby,在我的类中我需要保持与这 4 个构造函数的兼容性:
def initialize(b)
def initialize(a, b)
def initialize(b, c)
def initialize(a, b, c)
我正在尝试这种方式,但它不起作用:
def initialize(a="", b, c="")
有没有聪明的解决方案?我不能使用哈希。
我正在将一些代码从其他语言移植到 Ruby,在我的类中我需要保持与这 4 个构造函数的兼容性:
def initialize(b)
def initialize(a, b)
def initialize(b, c)
def initialize(a, b, c)
我正在尝试这种方式,但它不起作用:
def initialize(a="", b, c="")
有没有聪明的解决方案?我不能使用哈希。
如果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
。
如果你不能使用哈希(为什么不呢?),而且它们必须是initialize
方法,那么你很可能不走运。如果没有键入或位置信息,就无法解构,例如,数组,并确定哪个参数是哪个。
IMO 最干净的方法是提供执行构造并接受特定于构造函数(在本例中为工厂)的参数的类方法。
我想,如果参数是不同类型的,您可以使用该信息来确定传入哪些值,但 IMO 很快就会变得非常难看。
这可能是一个解决方案,但它很丑!
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