0

我正在做一个 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

事实上,我希望配置文件中的每个参数都可以像这样访问。这只是我的第一个想法,因为它看起来不错,而 ruby​​ 似乎是一种可以做到这一点的语言。如果你有更好的主意,我接受;)(我也想到了一个愚蠢的哈希,但是写 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
4

1 回答 1

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

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

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

def method_missing(methId)
   cfg[methId]
end
于 2014-09-16T09:26:54.660 回答