YAMLの復習
YAMLのノードには3種類(kind)がある:
- Scalar (Unicodeの文字列として表現できるもの)
- Sequence (配列みたいなもの)
- Mapping (連想配列やHashみたいなもの)
それぞれのkindはいくつかのstyleで出力できる。
- Scalar:
- Plain (1行)
1 Lorem ipsum dolor sit amet, consectetu
r adipiscing elit. - Single Quote (1行)
1 'Lorem ipsum dolor sit amet, consectetu
r adipiscing elit. ' - Double Quote (1行)
1 "Lorem ipsum dolor sit amet, consectetu
r adipiscing elit. " - Block Literal (改行がそのまま残る)
1 --- | 2 Lorem ipsum dolor sit amet, 3 consectetu
r adipiscing elit. 4 Pellentesq ue tincidunt molestie est. 5 Vestibulum ante odio, euismod ac, 6 sagittis et, tempus ut, lorem. 7 Praesent consectetu r tempor ipsum. 8 Nulla facilisi. - Block Folding (改行が空白になる)
1 --- > 2 Lorem ipsum dolor sit amet, 3 consectetu
r adipiscing elit. 4 Pellentesq ue tincidunt molestie est. 5 Vestibulum ante odio, euismod ac, 6 sagittis et, tempus ut, lorem. 7 Praesent consectetu r tempor ipsum. 8 Nulla facilisi.
- Plain (1行)
- Sequence
- デフォルト
1 - one 2 - two 3 - three
- inline
1 [1, 2, 3]
- デフォルト
- Mapping
- デフォルト
1 height: 170 2 weight: 60
- inline
1 { height: 170, weight: 60}
- デフォルト
で、
YAML::dumpto_yaml_st
をオブジェクトに定義すればよい、という裏技(非ドキュメントメソッド)を紹介したい。このメソッドの返り値がそのオブジェクトのstyleになる。
例えば:
1 class String 2 def to_yaml_style 3 return :quote2 4 end 5 end
をすれば、YAML::dump
Rubyでのスタイルは以下:
1 :plain # クオートなし 2 :quote1 # シングルクオート 3 :quote2 # ダブルクオート 4 :literal # Block Literal 5 :fold # Block Folding 6 :inline # Inline (Sequence, Mapping) 7 nil # デフォルト (Sequence, Mapping)
ちなみに、これを調べた切っ掛けはHashをYAML::dump
1 name: "鈴木" 2 height: 170 3 weight: 60
をこれにする:
1 name: "鈴木" 2 height: "170" 3 weight: "60"
monkeypatc
1 class Hash 2 def to_yaml_with_quoted_ strings(*args) 3 class << self 4 unless method_def ined?(:each_with_ quoted_str ings) 5 def each_with_ quoted_str ings 6 each_with_ normal_str ings do |k,v| 7 if String === v && !v.frozen? 8 def v.to_yaml_ style; return :quote2; end 9 end 10 yield k, v 11 end 12 end 13 alias_meth od :each_with_ normal_str ings, :each 14 alias_meth od :each, :each_with_ quoted_str ings 15 end 16 end 17 return to_yaml_wi th_normal_ strings(*args) 18 end 19 alias_meth od :to_yaml_wi th_normal_ strings, :to_yaml 20 alias_meth od :to_yaml, :to_yaml_wi th_quoted_ strings 21 end
参考
posted by
lchin
on Wed 1 Apr 2009
at 16:53