なにかとお世話なる Yaml ですが、いつも雰囲気でやっていました。もう少し仲良くなりたいなと思いましてこれを書きます。
そもそも、ハッシュの中のリストの書き方が、
a:
- b # 行頭スペースなし
- c
でも
a:
- b # 行頭スペースあり
- c
でも良いということから端を発しています。
ぼくは、書き方の統一感が好きなので、Rails では Rubocop とかが好きで、yaml ファイルのこのユレが気になって仕方がないのです。Rubocop でこの辺のことを制御できるのかは知らないのですが。そもそもどっちが正しいのかをわかっていなかったのです。結論どっちも正しい。
ruby => yaml
to_yaml
という便利なものがあります。
pry(main)> puts ({"a"=>[1,2]}.to_yaml)
---
a:
- 1
- 2
=> nil
(こんな感じで、配列の行頭にスペースがない...。まあいいのですが。)
yaml => ruby
YAML.load
という便利なものがあります。
pry(main)> YAML.load("a: 1")
=> {"a"=>1}
pry(main)> YAML.load(%Q{a:\n- 1\n- 2})
=> {"a"=>[1, 2]}
pry(main)> YAML.load(<<EOF)
pry(main)* a:
pry(main)* - b
pry(main)* - c
pry(main)* d
pry(main)* EOF
=> {"a"=>["b", "c d"]}
Anchor, Alias, Merge
よくみるのは、以下のようなもの
a: &a
foo: 1
bar: 2
hoge:
piyo: 3
<<: *a
これは、ruby だとこんな感じになります。
pry(main)> YAML.load(<<EOF)
pry(main)* a: &a
pry(main)* foo: 1
pry(main)* bar: 2
pry(main)* hoge:
pry(main)* piyo: 3
pry(main)* <<: *a
pry(main)* EOF
=> {"a"=>{"foo"=>1, "bar"=>2}, "hoge"=>{"piyo"=>3, "foo"=>1, "bar"=>2}}
アンカー: &
エイリアス: *
マージ: <<
をつかっています。なので、それぞれ理解すると良いと思う。
改行について
|
と >
には以下の違いがあります。
pry(main)> YAML.load(<<EOF)
pry(main)* a: |
pry(main)* My
pry(main)* name
pry(main)* is
pry(main)* EOF
=> {"a"=>"My\nname\nis\n"
pry(main)> YAML.load(<<EOF)
pry(main)* a: >
pry(main)* My
pry(main)* name
pry(main)* is
pry(main)* EOF
=> {"a"=>"My name is\n"}
|-
とか >-
を使うと、最終行末の \n
をなくすことができます。
配列の中のハッシュの中の、改行
この書き方で少し悩みました。
- a: 1
- b: |
hoge
piyo
- c : 3
- a: 1
- b: |
hoge
piyo
- c : 3
- a: 1
- b: |
hoge
piyo
- c : 3
でも、このスペースの数でミスるのはいやなので、以下のように書いています。
- a: 1
-
b: |
hoge
piyo
- c : 3
以上です。すこし Yaml と仲良くなれた気がします