0

我正在将一些代码从其他语言移植到 Ruby,在我的类中我需要保持与这 4 个构造函数的兼容性:

def initialize(b)
def initialize(a, b)
def initialize(b, c)
def initialize(a, b, c)

我正在尝试这种方式,但它不起作用:

def initialize(a="", b, c="")

有没有聪明的解决方案?我不能使用哈希。

4

3 回答 3

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

于 2012-06-22T16:58:56.167 回答
2

如果你不能使用哈希(为什么不呢?),而且它们必须initialize方法,那么你很可能不走运。如果没有键入或位置信息,就无法解构,例如,数组,并确定哪个参数是哪个。

IMO 最干净的方法是提供执行构造并接受特定于构造函数(在本例中为工厂)的参数的类方法。

我想,如果参数是不同类型的,您可以使用该信息来确定传入哪些值,但 IMO 很快就会变得非常难看。

于 2012-06-22T16:35:22.920 回答
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
于 2012-06-22T17:29:58.823 回答