How can I dynamically set without having to write the same code all over.
Right now the code looks like this:
def initialize(keywords: keywords, title: t
Here is a working example based on Sawa's answer. Option number #1 is not working right with inheritance.
class CsvOutline
def initialize( headers: [],
body: [],
folder: 'tmp',
file_prefix: 'test',
filename: "#{file_prefix}_#{Time.zone.now.strftime("%Y%m%d%H%M%S")}.csv",
path: File.join(folder, filename))
# Set instance variables and attribute accessors based on named parameters in initialize
local_variables.each do |k|
class_eval do
attr_accessor k
end
v = eval(k.to_s)
instance_variable_set("@#{k}", v) unless v.nil?
end
end
end
now if I was to create a child class
class ReportCsv < CsvOutline
def initialize
super(folder: 'reports', file_prefix: 'Report')
end
end
Now the child will initialize with the proper folder and file_prefix. If I was to use the second option - they'll be initialized to nil.
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
or following John Ledbetter and Cary Swoveland's suggestion:
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