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?
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_file,eval如果可以,最好避免。