【问题标题】:Ruby - Overload solution for initialize with 3 paramsRuby - 使用 3 个参数进行初始化的重载解决方案
【发布时间】:2012-06-22 16:33:00
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • initialize(a, b)initialize(b, c)有什么区别?
  • abc 是完全不同的类型。
  • 将代码从静态类型语言转换为动态类型语言,您要么必须从根本上改变一些东西,要么实现非常丑陋的非 Ruby 解决方法。
  • 您想转换为 Ruby 但使用您要迁移的语言的约定对我来说没有意义。
  • 也许移植到 Ruby 根本没有意义。如果我能找到一些规则,那么我可以自动移植。有什么工具可以做到这一点吗?

标签: ruby constructor-overloading


【解决方案1】:

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

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

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

【讨论】:

  • 我不能使用哈希,因为我不想重写对该方法的大量调用。我正在移植代码,我正在尝试找到最简单的方法。
  • 参数类型不同,我认为这可能是唯一的解决方案......叹息。
【解决方案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

【讨论】:

    【解决方案3】:

    这可能是一个解决方案,但它很丑!

    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
    

    【讨论】:

      猜你喜欢
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 2016-01-09
      • 2015-08-19
      • 2020-12-13
      • 2010-11-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多