動作環境・概要

  • 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記法を試してみよう

  • Rubyインライン配列(parse.rb)
emails = [
	"yuji@dev.com",
	"shimojo@dev.com"
]

p emails
$ ruby parse.rb
["yuji@dev.com", "shimojo@dev.com"]
  • 外部ファイルとして配列をYAMLで記述
  • mydata.yml
- yuji@dev.com
- shimojo@dev.com
- shimojo@gmail.com
  • parse.rb
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)
  • スカラー
    • 文字列
    • 数値
    • 真偽値
    • Null
    • 日付
  • mydata.yml
- 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"]

シーケンス(配列)を扱ってみよう

  • mydata.yml
# ブロックスタイル
- 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"]

マッピング(ハッシュ)を扱ってみよう

  • mydata.yml
# ブロックスタイル
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"}}

複数のデータを解釈してみよう

  • mydata.yml
# 複数のデータを1つのファイルに記述する

---  # データの開始
- a
- b
- c
...  # データの終了。省略可

---
- 1
- 2
- 3
...
  • parse.rb
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メソッドを試してみよう

  • parse.rb
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

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-09-19 (月) 12:28:10 (612d)