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

Ric*_*h_F 2 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
Run Code Online (Sandbox Code Playgroud)

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

tad*_*man 5

如果你要这样做,你需要接受的不是你指定的参数数组(varargs样式),而是选项hash或new keyword-args样式选项.

经典方法:

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

新的关键字参数方法:

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

您还可以将OpenStruct子类化为免费获取此类行为.

请记住,有一种新的选项样式可能是这两种方法的良好组合:

def initialize(sid: '123', token: '...', ...)
  @sid = sid
  @token = token
  # ...
end
Run Code Online (Sandbox Code Playgroud)

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