在运行时创建自定义访问者

时间:2014-09-16 09:08:09

标签: ruby config attr-accessor

我正在研究一个Ruby项目。自从我学习以来,我一直在努力做正确的事。 我想解析一个简单的配置文件(param = value),这部分完成了。 现在我想做点什么:

class ConfigFile
     def self.parse_file s
          # gem parsing the file
          ParseConfig.new(s)
     end 
     parse_file "config.cfg"
end

puts ConfigFile::default_port
puts ConfilgFile::default_ip
# etc

实际上,我希望配置文件中的每个参数都可以像这样访问。 这只是我的第一个想法,因为它看起来不错,而且红宝石似乎是可以做到的那种语言。如果你有更好的想法,我会采取;) (我也想过一个愚蠢的哈希,但编写ConfigFile :: h [:default_ip]已经很久了)

我知道我应该在某个地方使用attr_accessor。但是我的元编程技巧非常有限,所以如果有人能够对此有所了解,我将非常感激!

谢谢

日光

编辑1:

现在我已经这样做了,但这对我来说并不是那么好看:

class EMMConfig
       require 'parseconfig'

       PATH = "config.cfg"
       @@C = {}
       def self.parse
               @@C = ParseConfig.new(PATH)
      end

      def self.[](param)
               @@C[param]
      end

      def self.list_param
              @@C.get_params
      end

      parse
end

1 个答案:

答案 0 :(得分:1)

你可以在这里进行元编程,但有很多选择。

例如,你可以使用OpenStruct,它基本上已经是你想要的(但在内部使用元编程)t:将哈希转换为对象

示例:

cfg={:default_port=>88,:default_ip=>"1.2.3.4"}
cfg=OpenStruct.new cfg

然后您可以访问

cfg.default_port
cfg.default_ip

所以我会把它重写为:

class ConfigFile < OpenStruct
  @@cfg=nil
  def self.parse_file s
       # gem parsing the file
       ConfigFile.new(ParseConfig.new(s))
  end 
  def self.get_default_config
     if @@cfg||(@@cfg=parse_file("config.cfg"))
  end
end

并像这样使用

cfg=ConfigFile.get_default_config
cfg.default_ip

如果你真的想自己做,你需要检查&#34; method_missing&#34; (http://www.ruby-doc.org/core-2.1.0/BasicObject.html#method-i-method_missing

基本上你做(我强烈建议你在变量实例上做,而不是类实例)

def method_missing(methId)
   cfg[methId]
end