#contents ** 動作環境・概要 [#x23f3db8] - 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記法を試してみよう [#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 - 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"] ** シーケンス(配列)を扱ってみよう [#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