【问题标题】:Pass optional arguments to superclass将可选参数传递给超类
【发布时间】:2014-09-12 02:07:03
【问题描述】:
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

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

【问题讨论】:

  • 我应该补充一点,我的意图是让b 基本上是一个选项哈希,通过它在父类中设置多个实例变量。
  • 你试过initialize(a, b={})吗?
  • 这绝对是一个'用你的手掌拍自己的额头'的时刻。谢谢,@UriAgassi!如果你回答而不是评论,我可以接受。
  • 要解决您必须使用救援的问题,请尝试使用 fetch。 apidock.com/ruby/v1_9_3_392/Hash/fetch my_var = b.fetch(:some_key,{}) my_var = b.fetch(:some_key, {:some_key => 'something more specific'})
  • 你考虑过.nil?.is_a? Hash.has_key?()吗?

标签: ruby oop inheritance


【解决方案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" 

在 ruby​​ 2.0 及以后的版本中,您可以使用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 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-26
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多