2016-03-03 51 views
0

您好我想初始化通過一些配置文件dinamically紅寶石對象的實例的屬性,我可以做到這一點非常快使用下面的代碼:attr_accessor和元編程紅寶石

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 

怎麼辦我給屬性「@#{k}」屬性attr_accessor?

+2

你知道'attr_accessor'是做什麼的,對吧?所以你可以用那個實例變量以類似的方式定義這些方法。 –

+0

您應該在實例的* singleton類*上定義getter和setter。否則,你會污染你的ApiTester類,因此會污染你的每個實例。另一種選擇是基於配置動態地生成一個完整的類。 – Stefan

回答

3
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 

順便說一句,你應該建立一個.yaml文件,並使用YAML::load_file,這是爲了避免eval如果你能的最佳做法。