有没有办法在 Ruby YAML 文件中指定 ruby​​ 类/模块常量作为值

Posted

技术标签:

【中文标题】有没有办法在 Ruby YAML 文件中指定 ruby​​ 类/模块常量作为值【英文标题】:Is there a way to specify ruby class/module constant as value in Ruby YAML file 【发布时间】:2014-10-17 22:16:04 【问题描述】:

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

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

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

这是我一直在玩的,但是查看 psych ruby​​ 代码,我没有看到任何可能支持它的东西。

config.yml

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

在 irb 中

irb> 需要'记录器'

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

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

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

irb> p 评估配置['loglevel'] 0 ==> 0

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

【问题讨论】:

【参考方案1】:

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

在 Ruby 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'

【讨论】:

【参考方案2】:

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

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 

【讨论】:

以上是关于有没有办法在 Ruby YAML 文件中指定 ruby​​ 类/模块常量作为值的主要内容,如果未能解决你的问题,请参考以下文章

在 GCP cloudbuild.yaml 中指定与“名称”不同的“执行函数”

有没有办法在 app.xaml 文件的样式中指定 OnPlatform ?

有没有办法在nodeJS POST API请求中指定本地文件系统路径,能够使用curl而不是nodejs进行api调用

nmake.exe:有没有办法从宏中指定的一组文件中排除一个文件?

如何在 yaml-cpp 中指定 Null 节点的输出格式?

AnyLogic:有没有办法在优化实验中指定决策变量数组?