在初始化时使用attr_accessor设置ruby 2.0关键字参数

Hen*_*rik 14 ruby

如何动态设置而无需全部编写相同的代码.

现在代码看起来像这样:

def initialize(keywords: keywords, title: title, url: url, adsetting: adsetting)
  self.keywords = keywords
  self.title = title
  self.url = url
  self.adsetting = adsetting
end
Run Code Online (Sandbox Code Playgroud)

如果列表变长,这很快就会失控.

使用ruby 1.9,我只是将哈希传递给方法.像这样:

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

但我宁愿使用Ruby 2.0关键字参数.可以实现类似的东西吗?

def initialize(keywords: keywords, title: title, url: url, adsetting: adsetting)
  args.each do |k,v|
    instance_variable_set("@#{k}", v) unless v.nil?
  end
end
Run Code Online (Sandbox Code Playgroud)

saw*_*awa 16

def initialize(keywords: nil, title: nil, url: nil, adsetting: nil)
  local_variables.each do |k|
    v = eval(k.to_s)
    instance_variable_set("@#{k}", v) unless v.nil?
  end
end
Run Code Online (Sandbox Code Playgroud)

或遵循John Ledbetter和Cary Swoveland的建议:

def initialize(keywords: nil, title: nil, url: nil, adsetting: nil)
  method(__method__).parameters.each do |type, k|
    next unless type == :key
    v = eval(k.to_s)
    instance_variable_set("@#{k}", v) unless v.nil?
  end
end
Run Code Online (Sandbox Code Playgroud)

  • 您还可以查看`self.method(:initialize).parameters`,它还会告诉您参数的类型(例如,optional,required,key,glob ...) (4认同)