前面的冒号:YAML语法

时间:2015-07-28 10:35:39

标签: ruby-on-rails ruby yaml sidekiq

我目前正在项目中使用Sidekiq,我有以下YAML配置文件:

:concurrency: 5
:pidfile: /tmp/pids/sidekiq.pid
:logfile: log/sidekiq.log
staging:
  :concurrency: 10
production:
  :concurrency: 20
queues:
  - default

我之前没有看到在一把钥匙前面有一个冒号,但省略了冒号会产生有趣的结果。例如,在:pidfile:的情况下,冒号位于前面,它会创建/覆盖目标文件,如果没有它,它会使用已经存在的目标文件并且不会写入它。

这是在某处记录的,还是Sidekiq对某些键的期望?

2 个答案:

答案 0 :(得分:15)

以冒号开头的YAML键在Ruby中生成符号化键,而没有冒号的键将生成字符串化键:

{{1}}

注意:如果gem依赖于符号化键,则字符串化键不会覆盖其默认值。

答案 1 :(得分:3)

实际上并非特定于sidekiq。键前面的冒号只是使该键成为符号而不是字符串:

# example.yml
a:
  value: 1
:b:
  value: 2


yaml = YAML.load_file('example.yml')

yaml["a"] => { "value" => 1 }
yaml[:b] => { "value" => 1 }

因此,如果您的代码使用键符号访问配置,您应该在yaml文件中的键前添加冒号,或者对结果哈希使用#with_indifferent_access之类的一些键转换(在解析之后) yaml文件)