2012-10-03 28 views
3

根據Phrogz和我的答案this question,使用Ruby 1.9所使用的YAML庫似乎只允許幾個選項:indentationline_widthcanonical,(和line_wrap通過設置line_width-1)。我想使用官方YAML格式允許的其他選項,包括但不限於use_block。是否有可能通過一個小小的黑客來激活其他選項,或者是否有Ruby 1.9的替代yaml庫允許其他選項?爲什麼yaml庫不提供其他選項?YAML更多的選擇

回答

0

作爲一種暫時的解決方案,我發現了ya2yaml。不過,這存在一些問題。

  1. 它沒有閱讀能力。這只是爲了寫作。
  2. 它沒有完全輸出不受歡迎的Ruby類,並帶有!ruby/class ...表示法。在yaml gem中,這個符號被完全使用,所以Ruby類被保存在ruby-yaml-ruby往返中。
  3. 它使用符號的!ruby/symbol ...表示法,這與yaml gem中使用的:...表示法相比看起來很長。
  4. 它對散列鍵使用? ... \n: yaml語法,與yaml gem更緊湊的散列符號相比,它看起來很長。

問題2不是一個大不了我到目前爲止,所以我用下面的方式YAML和ya2yaml寶石的組合,克服存在的問題1,3,4:

require "yaml" # For reading. 
require "ya2yaml" # For writing. 

class Object 
    def to_yaml # Method for writing in yaml 
    ya2yaml. 
    # Put hash key on a single line if it is a symbol 
    gsub(/^(\s*)\? !ruby\/symbol (\S+)\s+/, '\1:\2'). 
    # Use symbol literal 
    gsub(/(?<=\s)!ruby\/symbol /, ':') 
    end 
end