2013-01-04 78 views
3

to_yaml方法會生成很好的YAML輸出,但我想在某些元素之前包含註釋行。有沒有辦法做到這一點?可以使用Ruby的YAML模塊來嵌入註釋嗎?

例如,我想製作:

# hostname or IP address of client 
client: host4.example.com 
# hostname or IP address of server 
server: 192.168.222.222 

從類似於:

{ 
    :client => 'host4.example.com', 
    :server => '192.168.222.222', 
}.to_yaml 

...但我不知道如果YAML模塊甚至有一種方式來完成。

更新:我最終沒有使用正則表達式插入註釋的解決方案,因爲它需要從註釋中分離數據。對我來說,最簡單,最易懂的解決方案是:

require 'yaml' 

source = <<SOURCE 
# hostname or IP address of client 
client: host4.example.com 
# hostname or IP address of server 
server: 192.168.222.222 
SOURCE 

conf = YAML::load(source) 

puts source 

對我的好處是沒有重複(例如,「客戶:」只指定一次),數據和評論在一起,來源可作爲YAML輸出,並且數據結構(在conf中可用)可供使用。

+0

你嘗試過什麼?是什麼讓你覺得它不起作用? http://yaml.org/spec/current.html#id2509980 –

+0

增加了額外的細節。 – sutch

回答

3

你可以做一個串上的所有插入替換:

require 'yaml' 

source = { 
    :client => 'host4.example.com', 
    :server => '192.168.222.222', 
}.to_yaml 

substitution_list = { 
    /:client:/ => "# hostname or IP address of client\n:client:", 
    /:server:/ => "# hostname or IP address of server\n:server:" 
} 

substitution_list.each do |pattern, replacement| 
    source.gsub!(pattern, replacement) 
end 

puts source 

輸出:

--- 
# hostname or IP address of client 
:client: host4.example.com 
# hostname or IP address of server 
:server: 192.168.222.222 
+0

這可行,但我不喜歡這是如何分離評論和數據。我用我正在使用的東西更新了我的問題。 – sutch

2

事情是這樣的:

my_hash = {a: 444} 
y=YAML::Stream.new() 
y.add(my_hash) 
y.emit("# this is a comment") 

當然,你將需要步行輸入散列自己,要麼add()emit()需要。 你可以看看to_yaml方法的來源以便快速入門。

+0

這並不真正評論一個領域,中期哈希,就像他似乎想要的,但。 –

+0

這是一個幫助他開始的例子。讓我在答案中澄清一下。 – Zabba

+1

備註:在你的代碼中,我得到一個錯誤'psych/streaming.rb:6:'初始化':錯誤的參數數量(0代表1)'。爲了處理你的代碼,我必須用'YAML :: ENGINE.yamler ='syck''來更改YAML引擎(我使用win7中的「ruby 1.9.3p194(2012-04-20)[i386-mingw32]」) 。 – knut

相關問題