将可选参数传递给超类

时间:2014-07-21 14:12:50

标签: ruby oop inheritance

module MyModule
  class Parent
    def initialize(a, b=nil)
      begin 
        @my_var = b[:some_key]
      rescue
        @my_var = {}
      end
    end
  end
end

module MyModule
  class Child < Parent
    def initialize(a, b=nil)
      super a, b
      begin 
        @my_var = b[:some_key]
      rescue
        @my_var = {:some_key => 'something more specific'}
      end
    end
  end
end 

我有两个类,我基本上使用begin / rescue / end将可选参数设置为实例变量。我知道我在这里使用异常处理来控制流程,我只是不知道另一种方式!如何将@my_var设置为自身(非零)或空哈希?

我试过......

def initialize(a, b=nil)
  b ||= {}
  super
end

我想我的主要问题是我不明白可选的args和super是如何工作的?我在模块中继承的事实会改变什么吗?

1 个答案:

答案 0 :(得分:1)

如果没有传递参数,则使用默认值,因此您可以为子和父使用不同的默认值(因为super显式传递了可选参数)。

实际上(正如@CarySwoveland所评论的那样)您甚至不必将参数写入super,因为在没有参数的情况下编写super会隐式传递原始参数。

module MyModule
  class Parent
    def initialize(a, b={})
      @my_var = b[:some_key]
    end
     attr_accessor :my_var
  end
end

module MyModule
  class Child < Parent
    def initialize(a, b={some_key: 'something more specific'})
      super
    end
  end
end 

MyModule::Parent.new('a').my_var
# => nil 
MyModule::Child.new('a').my_var
# => "something more specific" 

在2.0以后的ruby版本中,您可以使用Keyword Arguments更明确地执行相同的操作:

module MyModule
  class Parent
    def initialize(a, some_key: nil)
      @my_var = some_key
    end
     attr_accessor :my_var
  end
end

module MyModule
  class Child < Parent
    def initialize(a, some_key: 'something more specific')
      super
    end
  end
end