Ruby - 用3个参数初始化的重载解决方案

时间:2012-06-22 16:33:01

标签: ruby constructor-overloading

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

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

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

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

有智能解决方案吗?我不能使用哈希。

3 个答案:

答案 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