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 # 読み込まれない