有没有办法在 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:有没有办法从宏中指定的一组文件中排除一个文件?