2015-07-28 228 views
9

我目前在项目中使用Sidekiq和我有以下YAML配置文件:冒号在前面:YAML语法

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

我还没有看到有一个冒号在一个关键的前之前,但省略该冒号会产生有趣的结果。以:pidfile:为例,前面的冒号会创建/覆盖没有它的目标文件,它会使用已经存在的目标文件并且不会写入它。

这是记录在某处或者这只是如何Sidekiq期望某些键?

回答

11

YAML密钥产生象征着红宝石键(解析YAML文件后),而无需一个冒号密钥将生成字符串化的键:

require 'yaml' 

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

YAML.load(string) 
# { 
#  :concurrency => 5, 
#  :pidfile  => "/tmp/pids/sidekiq.pid", 
#  :logfile  => "log/sidekiq.log", 
#  "staging" => { 
#   :concurrency => 10 
#  }, 
#  "production" => { 
#   :concurrency => 20 
#  }, 
#  "queues"  => [ 
#   [0] "default" 
#  ] 
# } 

注意:如果一个gem依赖于符号化的键,那么字符串化的键将不会覆盖它的默认值。

+0

加一个符号键。在Ruby之前,我从来没有见过这种情况,但是已经看到需要将符号作为关键字的地方。有用的信息 – TheJKFever

+0

我明白这是如何在Ruby中表现出来的......但是就语法YAML而言,用冒号开始一个键是合法的,它只是用解释器来生成符号,结肠? – Brian

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用于结果散列键的一些转化

开始用冒号
+0

谢谢!我纠正了答案。 –

+0

所以这是一个红宝石特定的行为,并没有被任何其他语言使用吗? – Tony