Ruby 中的 attr_accessor 和元编程

0 ruby metaprogramming attr-accessor

嗨,我想通过一些配置文件动态地初始化 ruby​​ 对象实例的属性,我可以使用以下代码快速完成:

class ApiTester

  def initialize(path= "api_test")
    h = eval(File.open("#{path}/config.hash","r").read)
    h.each do |k,v|
      eval("@#{k}=#{v.class == String ? "\"#{v}\"" :  v }" )
    end
  end

end
Run Code Online (Sandbox Code Playgroud)

如何为属性“@#{k}”提供属性 attr_accessor?

Lev*_*tix 5

class ApiTester
  def initialize(path= "api_test")
    h = { a: 1, b: 2 }
    h.each do |k,v|
      instance_variable_set("@#{k}", v)
      self.class.send(:attr_accessor, k)
    end
  end
end

api_tester = ApiTester.new
puts api_tester.a # => 1
puts api_tester.b # => 2

api_tester.a = 3
puts api_tester.a # => 3
Run Code Online (Sandbox Code Playgroud)

顺便说一句,您可能应该创建一个.yaml文件并使用YAML::load_fileeval如果可以,最好避免。