将setter与instance_variable_set一起使用

时间:2015-01-14 14:18:18

标签: ruby setter

我正在使用这个简单的构造来初始化一个带有哈希的类:

def initialize(params)
  params.each { |k, v| instance_variable_set("@#{k}", v) }
end

但是instance_variable_set不使用setter,所以我无法处理特殊能力。 还有另一种很好的方法来初始化类并在setter方法中处理一些额外的东西吗?

2 个答案:

答案 0 :(得分:3)

您可以使用sendself上调用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
相关问题