2

我有一个 YAML 配置文件,我想在其中包含特定的 ruby​​ 类/模块常量而不是实际值。

例如,我想要“loglevel: Logger::DEBUG”,而不是把“loglevel: 0”放在配置文件中。

有没有办法让 YAML 解码或解析像 Logger::DEBUG 这样的类或模块常量?

这就是我一直在玩的东西,但是看着 psych ruby​​ 代码,我看不到任何可能支持这一点的东西。

配置.yml

loglevel: !ruby/class:fixnum Logger::DEBUG

在 irb

irb> 需要“记录器”

irb> config = YAML.load_file('config.yml')

config['loglevel'] 包含“Logger::DEBUG”作为字符串而不是实际值。

我可以像这样对其进行评估:

irb> p eval config['loglevel'] 0 ==> 0

我只是想知道是否有办法让 YAML 评估它?在进行 YAML 加载后,我可以在我的代码中执行此操作,但我想确保我不遗余力,这已经变成了一个漫长的任务 ;-)。

4

2 回答 2

3

不确定 YAML 方式,但最好不要使用 eval ...

在红宝石 2+

Object.const_get 'Logger::DEBUG'

或者老学校

def const_lookup const_name
  const_name.split('::').inject(Object) do |rec, name|
    rec.const_get(name)
  end
end

const_lookup 'Logger::DEBUG'
于 2014-08-24T19:33:13.220 回答
1

看起来你可以为类/模块而不是它们的常量

2.0.0-p247 :046 > YAML.load("!ruby/class 'String'")
 => String 
2.0.0-p247 :047 > YAML.load("!ruby/class 'String'").class
 => Class 
2.0.0-p247 :065 > YAML.load("!ruby/class 'Logger'")
 => Logger 
于 2014-08-24T19:42:23.413 回答