我正在研究一个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
答案 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