yaml - nora75/tah2_map GitHub Wiki

yamlとは。

  • yaml ain't markup language の略
  • 構造化されたデータの表現記法。
  • フレームワーク・ツールの設定ファイルに利用されている。
  • Ruby関連の設定ファイルでよく利用されている。
  • 拡張子は.ymlが使われる事が多い。
  • YAMLではデータ構造を自動で判別してくれる。
  • #でコメント可能。

その用途

  • 各種設定ファイル
  • データの保存・シリアライゼーション用
  • データ交換用フォーマット
  • ログファイル

特徴

  • 読みやすく・書きやすく・わかりやすいという特徴がある
  • インデントを使ってデータの階層構造を表す
  • 終了タグが存在しない
  • データ構造をマッピング・配列・スカラーの三種類で表す

YAMLが扱えるデータ型

スカラー(値)

  • 文字列
    • hello
  • 数値
    • 2
    • 32.5
  • 真偽値
    • true/false
    • yes/no
    • on/off
  • NULL
    • null
    • ~
  • 日付
    • 2015-07-08
  • タイムスタンプ(yyyy-mm-dd hh:mm:ss [+-]hh:mm)
    • 2005-01-01 00:00:00 +09:00

シーケンス(配列)

  • ハイフン(-)に引き続きスカラーを記載する。(ブロックスタイル)
  • -の後ろにはスペースが必要(タブ文字は使用不可)。
  • インラインで[ ]で記載も可能(フロースタイル)
  • ネスト(入れ子)で記載も可能
    • 値の無い行の後に字下げを使うとネスト(入れ子)構造になる
    • 字下げは1文字以上の空白(tabは不可)が必要になる。

ex

ex1>ブロックスタイル。

- aaa
- bbb
- ccc

ex2>ネスト(入れ子)。

- aaa
-
  - b1
  - b2
  -
    - b3.1
    - b3.2
- ccc

ex3>フロースタイル。

[milk, bread, eggs]

実行結果

ex1> ["aaa", "bbb", "ccc"]
ex2> ["aaa", ["b1", "b2", ["b3.1", "b3.2"]], "ccc"]
ex3> ["milk","bread","eggs"]

マッピング(ハッシュ・連想配列)

  • 「キー: 値」の形式で表す。
  • コロン「:」のあとに半角スペースを1つ以上入れてください (タブ文字は使えません)。
  • コロン(:)でkey/value形式で利用する。(ブロックスタイル)
  • インラインで{ }で記載も可能(フロースタイル)

ex

ex1>ブロックスタイル。

A: aaa
B: bbb
C: ccc

ex2>ネスト(入れ子)。

A: aaa
B:
B1: bbb1
B2: bbb2
C: ccc

ex3>フロースタイル。

{name: John Smith, age: 33}

ex4>エラー。

A: foo
a1: bar
a2: baz

実行結果

ex1> {"A"=>"aaa", "B"=>"bbb", "C"=>"ccc"}
ex2> {"A"=>"aaa", "B"=>{"B1"=>"bbb1", "B2"=>"bbb2"}, "C"=>"ccc"}
ex3> {"name"=>"John Smith","age"=>"33"}
ex4> エラー。

配列とマッピングのネスト

ex1>配列の中にマッピング。

- name:  Hanako
email: [email protected]
- name:  Sumire
email: [email protected]
- name:  Momoko
email: [email protected]

ex2>マッピングの中に配列。

names:
  - Hanako
  - Sumire
  - Momoko
emails:
  - [email protected]
  - [email protected]
  - [email protected]

実行結果。

ex1> [{"name"=>"Hanako", "email"=>"[email protected]"},{"name"=>"Sumire", "email"=>"[email protected]"},{"name"=>"Momoko", "email"=>"[email protected]"}]
ex2> {"emails"=>["[email protected]", "[email protected]", "[email protected]"],"names"=>["Hanako", "Sumire", "Momoko"]}

フロースタイル。

例にあるようにフロースタイルで書く事も可能であるが、フロースタイルを用いるとJSONと同じように書く事が可能になる。 即ちJSONをYAMLとして解釈する事が可能になるという事である。

型の明示的な指定。

YAMLでは!を用いる事によって明示的に型の指定が可能になる。 これを使うと、Ruby における Regexp や Symbol のように処理系の言語に依存した型も指定できるらしい。 ↓にrubyのサンプルもあるけど知らん。

ex

- !str 123            # 文字列
- !pairs              # 組 (要素が 2 つの配列)
  - A: aaa
  - B: bbb
- !ruby/sym  foo      # Ruby の Symbol
- !ruby/regexp /^$/   # Ruby の Regexp

実行結果。

["123", ["A", "aaa"], ["B", "bbb"](/nora75/tah2_map/wiki/"A",-"aaa"],-["B",-"bbb"), :foo, /^$/]

複数行の文字列を扱う。

ex

## 各行の改行を保存する
text1: |
aaa
bbb
ccc


## 各行の改行と、最終行に続く改行を保存する
text2: |+
aaa
bbb
ccc


## 各行の改行は保存するが、最終行の改行は取り除く
text3: |-
aaa
bbb
ccc


## 改行を半角スペースに置き換える、ただし最終行の改行は保存される
text4: >
aaa
bbb
ccc


## 改行を半角スペースに置き換え、最終行に続く改行を保存する
text5: >+
aaa
bbb
ccc


## 改行を半角スペースに置き換え、最終行の改行を取り除く
text6: >-
aaa
bbb
ccc

実行結果。

{"text1"=>"aaa\nbbb\nccc\n",
"text2"=>"aaa\nbbb\nccc\n\n\n",
"text3"=>"aaa\nbbb\nccc",
"text4"=>"aaa bbb ccc\n",
"text5"=>"aaa bbb ccc\n\n\n",
"text6"=>"aaa bbb ccc"}

インデント幅の明示的指定。

ex
- |2
    foo
    bar
    baz

- |0
    foo
    bar
    baz

- >2
    foo
    bar
    baz

- >0
    foo
    bar
    baz
実行結果。
["   foo\n   bar\n   baz\n",
 "foo\nbar\nbaz\n",
 "   foo\n   bar\n   baz\n",
 "foo bar baz\n"]

アンカーとエイリアス。

YAML では、データに「&name」で印をつけ、「*name」で参照することができます (C 言語におけるアドレスやポインタと同じ表記です)。 前者をアンカー (Anchor)、後者をエイリアス (Alias) といいます。

ex

ex1> 配列にアンカーを付ける。

- &mark foo
- bar
- *mark
- *mark

ex2> マッピングにアンカーを付ける。

A: &mark
   foo
B: bar
C: *mark

実行結果。

ex1> [mark, "bar", mark, mark]
ex2> { "A"=>mark, "B"=>"bar", "C"=>mark }

コメント。

#を書いた以降がコメントになる。 範囲コメントはないので注意。

# コメント
- aaa
- bbb        # これもコメント
- ccc

その他。

複数のYAMLドキュメントを1つのファイルに含める。

「---」で区切ることで、ひとつのファイルに複数の YAML ドキュメントを含めることができます。またひとつのファイルから複数の YAML ドキュメントを読み込むには、YAML.load_stream() を使います。これについては次回に説明します。

ex

---
name: foo
email: [email protected]
---
name: bar
email: [email protected]
---
name: baz
email: [email protected]

ファイルの終端を示す。

「...」だけの行があると、それ以降は読み込まれません。これは Ruby における「END」と同じようなものです。 この機能は、エラーがあった箇所を絞り込むときに便利です。

ex

- aaa
- bbb
...
- ccc      # 読み込まれない

参考。