Ruby
YAML

Yaml についてあれこれ忘れるので、戯れて覚える

なにかとお世話なる 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}}

アンカー: &
エイリアス: *
マージ: <<

をつかっています。なので、それぞれ理解すると良いと思う。

改行について

|> には以下の違いがあります。

\nになる
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 をなくすことができます。

配列の中のハッシュの中の、改行

この書き方で少し悩みました。

スペース1つはエラー
- a: 1
- b: |
 hoge
 piyo
- c : 3
スペース2つもエラー
- a: 1
- b: |
  hoge
  piyo
- c : 3
スペース3つはOK
- a: 1
- b: |
   hoge
   piyo
- c : 3

でも、このスペースの数でミスるのはいやなので、以下のように書いています。

- a: 1
- 
 b: |
  hoge
  piyo
- c : 3

以上です。すこし Yaml と仲良くなれた気がします :pear: