動作環境・概要 †
- OS X 10.11 El Capitan
- Vagrant 1.8.1
- VirtualBox 5.0.20 r106931
- ruby 2.0.0p598 (2014-11-13)
- 概要: 構造化されたデータの表現記法
- 公式サイト: http://yaml.org/
YAML記法を試してみよう †
emails = [
"yuji@dev.com",
"shimojo@dev.com"
]
p emails
$ ruby parse.rb
["yuji@dev.com", "shimojo@dev.com"]
- yuji@dev.com
- shimojo@dev.com
- shimojo@gmail.com
require 'yaml'
emails = YAML.load_file('mydata.yml')
p emails
$ ruby parse.rb
["yuji@dev.com", "shimojo@dev.com", "shimojo@gmail.com"]
スカラーを扱ってみよう †
- YAMLで扱えるデータ構造
- スカラー:値
- シーケンス:配列
- マッピング:ハッシュ(key/value)
- shimojo
- 52
- 33.5
- true # true/false, yes/no, on/off
- null # ~
- 2016-09-01
- "true"
- '555'
$ ruby parse.rb
["shimojo", 52, 33.5, true, nil, #<Date: 2016-09-01 ((2457633j,0s,0n),+0s,2299161j)>, "true", "555"]
シーケンス(配列)を扱ってみよう †
# ブロックスタイル
- a
- b
- c
# フロースタイル
[a, b, 10]
$ ruby parse.rb
["a", "b", "c"]
# ネスト(入れ子構造)
- a
-
- b-1
- b-2
- c
$ ruby parse.rb
["a", ["b-1", "b-2"], "c"]
マッピング(ハッシュ)を扱ってみよう †
# ブロックスタイル
name: shimojo
score: 90
# : の後の空白は必須
# : の前の空白は何文字あってもOK
# フロースタイル
{name: shimojo, score: 90}
$ ruby parse.rb
{"name"=>"shimojo", "score"=>90}
# ネスト(入れ子構造)
name: shimojo
score:
game-1: 30
game-2: 40
$ ruby parse.rb
{"name"=>"shimojo", "score"=>{"game-1"=>30, "game-2"=>40}}
複雑なデータを扱ってみよう †
# ブロックスタイル
names:
- shimojo
- kinjo
scores:
- 90
- 100
# フロースタイル
names: [shimojo, kinjo]
scores: [90, 100]
$ ruby parse.rb
{"names"=>["shimojo", "kinjo"], "scores"=>[90, 100]}
# ブロックスタイル
- name: shimojo
score: 90
- name: kinjo
score: 100
# フロースタイル
- {name: shimojo, score: 90}
- {name: kinjo, score: 100}
$ ruby parse.rb
[{"name"=>"shimojo", "score"=>90}, {"name"=>"kinjo", "score"=>100}]
改行を含むデータを扱ってみよう †
# 改行はスペースに変換される
this
is
a
pen.
$ ruby parse.rb
"this is a pen."
- | # 行末の改行を保持する
this
is
a
pen.
- |+ # 最終行の改行まで保持する
this
is
a
pen.
- |- # 行末の改行を保持しない
this
is
a
pen.
$ ruby parse.rb
["this\nis\na\npen.\n", "this\nis\na\npen.\n\n", "this\nis\na\npen."]
- >
this
is
a
pen.
- >+
this
is
a
pen.
- >-
this
is
a
pen.
$ ruby parse.rb
["this is a pen.\n", "this is a pen.\n\n", "this is a pen."]
アンカーとエイリアスを使ってみよう †
- &leader tanaka # アンカー
- *leader # エイリアス
- &staff sasaki
- *staff
- *staff
- *staff
- *staff
$ ruby parse.rb
["tanaka", "tanaka", "sasaki", "sasaki", "sasaki", "sasaki", "sasaki"]
- &shimojo
name: shimojo
score: 80
- &kinjo
name: kinjo
score: 90
friends:
- *shimojo
- &tanaka
name: tanaka
score: 100
friends:
- *shimojo
- *kinjo
$ ruby parse.rb
[{"name"=>"shimojo", "score"=>80}, {"name"=>"kinjo", "score"=>90, "friends"=>[{"name"=>"shimojo", "score"=>80}]}, {"name"=>"tanaka", "score"=>100, "friends"=>[{"name"=>"shimojo", "score"=>80}, {"name"=>"kinjo", "score"=>90, "friends"=>[{"name"=>"shimojo", "score"=>80}]}]}]
ハッシュをマージしてみよう †
common: &common
user: dbuser
password: dbpassword
development:
database: myapp_dev
<<: *common # commonよりuser / passwordを参照
production:
database: myapp_prod
<<: *common
test:
database: myapp_test
<<: *common
$ ruby parse.rb
{"common"=>{"user"=>"dbuser", "password"=>"dbpassword"}, "development"=>{"database"=>"myapp_dev", "user"=>"dbuser", "password"=>"dbpassword"}, "production"=>{"database"=>"myapp_prod", "user"=>"dbuser", "password"=>"dbpassword"}, "test"=>{"database"=>"myapp_test", "user"=>"dbuser", "password"=>"dbpassword"}}
複数のデータを解釈してみよう †
# 複数のデータを1つのファイルに記述する
--- # データの開始
- a
- b
- c
... # データの終了。省略可
---
- 1
- 2
- 3
...
require 'yaml'
File.open('mydata.yml') do |io|
YAML.load_documents(io) do |d|
p d
end
end
$ ruby parse.rb
["a", "b", "c"]
[1, 2, 3]
Rubyのto_yamlメソッドを試してみよう †
require 'yaml'
users = [
{'name' => 'shimojo', 'score' => 90},
{'name' => 'kinjo', 'score' => 100},
]
puts users.to_yaml # YAML形式に変換して出力
$ ruby parse.rb
---
- name: shimojo
score: 90
- name: kinjo
score: 100