我正在使用这个简单的构造来初始化一个带有哈希的类:
def initialize(params)
params.each { |k, v| instance_variable_set("@#{k}", v) }
end
但是instance_variable_set不使用setter,所以我无法处理特殊能力。 还有另一种很好的方法来初始化类并在setter方法中处理一些额外的东西吗?
答案 0 :(得分:3)
您可以使用send
在self
上调用setter方法:
params.each { |k, v| self.send("#{k}=", v) }
答案 1 :(得分:0)
扩展Logan的答案,你可以这样做来使用定义的setter并在未定义时创建访问器:
params.each do |name,value|
if respond_to?("#{name}=")
send "#{name}=", value
else
instance_variable_set "@#{name}",value
end
end
如果您对上述内容有疑问,请告诉我,我可以进一步更新答案。
更新
或者,正如@mudasobwa建议的那样,如果您希望所有实例变量都有默认的访问器方法,您可以使用以下形式:
params.each do |name,value|
attr_accessor(name) unless respond_to?("#{name}=")
send "#{name}=", value
end