Ruby对象使用可选参数初始化

时间:2017-03-15 01:18:18

标签: ruby parameters initialization

如何编写initalizer()方法来形成实例变量(空或其他),然后遍历一组args来设置实例变量?

这就是我的想法:

def initialize(*p)
  @sid                      = "123asdf654"
  @token                    = "abc123"
  @bert                     = "1192875119"
  @me                       = "4165551212"
  @media_url                = ""
  @message                  = ""

  args.each do |k,v|
    instance_variable_set("@#{k}", v) unless v.nil?
  end
end

我希望能够设置已知的实例变量(如此处所示),然后遍历args并更新所选实例变量的值,或者创建新的变量。

1 个答案:

答案 0 :(得分:5)

如果您要这样做,您需要接受的不是您指定的参数数组( varargs 样式),而是选项哈希或新< em> keyword-args 样式选项。

经典方法:

def initialize(attributes = nil)
  attributes and attributes.each do |k,v|
    instance_variable_set("@#{k}", v) unless v.nil?
  end
end

新的关键字参数方法:

def initialize(**options)
  attributes.each do |k,v|
    instance_variable_set("@#{k}", v) unless v.nil?
  end
end

您也可以将OpenStruct子类化为免费获得此类行为。

请记住,新的选项风格可能是这两种方法的良好组合:

def initialize(sid: '123', token: '...', ...)
  @sid = sid
  @token = token
  # ...
end

您可以为命名关键字参数指定默认值。