#contens

** 動作環境 [#x5e300b3]
- OS X 10.11 El Capitan
- Vagrant 1.8.1
- VirtualBox 5.0.20 r106931

** 概要 [#m53e32ff]
- 概要: 構造化されたデータの表現記法
- 公式サイト: http://yaml.org/
- 環境: ruby 2.0.0p598 (2014-11-13)

** YAML記法を試してみよう [#m1d08fcc]

- 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"]

** スカラーを扱ってみよう [#zcfb8b63]

- YAMLで扱えるデータ構造
-- スカラー:値
-- シーケンス:配列
-- マッピング:ハッシュ(key/value)

- スカラー
-- 文字列
-- 数値
-- 真偽値
-- Null
-- 日付

- mydata.yml

 - shimojo
 - 52
 - 33.5
 - true # true/ffalse, 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"]

** シーケンス(配列)を扱ってみよう [#l59c9982]

- 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"]

** マッピング(ハッシュ)を扱ってみよう [#e365be02]

- 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}}

** 複雑なデータを扱ってみよう [#sfca839d]

- 配列を値に持つハッシュ

 # ブロックスタイル
 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}]

** 改行を含むデータを扱ってみよう [#mb21e448]

 # 改行はスペースに変換される
 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."]

** アンカーとエイリアスを使ってみよう [#if4fc54a]

 - &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}]}]}]

** ハッシュをマージしてみよう [#e44d4870]

 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"}}

** 複数のデータを解釈してみよう [#s8316122]

- 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メソッドを試してみよう [#x185c7e6]

- 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