2015-07-28 40 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