かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

YAMLやってみよう

今まで名前は知ってるけど具体的な書き方は知らなかったYAML
とりあえずやってみる。

RubyYAMLを読み込むのはすごい簡単にできる。
大体以下のような感じ

require 'yaml'

obj = YAML.load("a")
p obj

loadの引数に、YAMLの文字列かIOのオブジェクトを渡すとOK
まだ、YAMLの書き方知らないので"a"を渡しておいた。
今後長いものを書くと思うのでヒアドキュメントにしておくのが吉だろう。

配列

YAMLは配列とハッシュと数値・文字列・真偽値あたりでデータを表せる。
とりあえず配列から!
配列は以下のような感じに-で書く。
-の後は半角スペースがいる。

require 'yaml'

obj = YAML.load(<<-EOS)
- a
- b
- c
EOS
p obj

実行すると

["a", "b", "c"]

確かに配列だ!

さらに、半角スペースでインデントさせると配列の中に配列を入れ込める。
ちょっとやっかいなのが、-だけの行を作らないといけないってところかな

obj = YAML.load(<<-EOS)
- a
- 
  - aa
  - ab
  - ac
- b
- 
  - ba
  - bb
- c
- 
  - ca
  - cb
EOS
p obj

実行結果

["a", ["aa", "ab", "ac"], "b", ["ba", "bb"], "c", ["ca", "cb"]]

これも確かに!!
-の後に半角スペース入れ忘れて5分くらいはまったorz
なやましい。

ハッシュ

次はハッシュ!
ハッシュは、キー: 値の形式で書く。:の後にはお約束の半角スペースがいる。
ってかインデントにTab使えないって何よ?
文句はおいといて実験

obj = YAML.load(<<-EOS)
name: Tarou
age: 12
EOS
p obj

実行すると

{"name"=>"Tarou", "age"=>12}

うん。予想通り。
色々と入れ子も出来る。こんな感じに

require 'yaml'

obj = YAML.load(<<-EOS)
score:
  - 10
  - 12
  - 34
  - 45
name: Tarou
status:
  str: 12
  int: 0
  dix: 3
EOS
p obj

実行結果

{"status"=>{"int"=>0, "str"=>12, "dix"=>3}, "name"=>"Tarou", "score"=>[10, 12, 34, 45]}

フロースタイル

今までやってきたのより楽な書き方があるってよ。
配列は[]で囲って, (カンマ+半角スペース)で区切る。ハッシュは、{}で囲ってキーと値の間は: (コロン+半角スペースね)で区切る。
ってことはこんな風にかけるんだ

require 'yaml'

obj = YAML.load(<<-EOS)
- {name: Tarou, score: [1, 2, 3, 4], param: {str: 10, int: 4}}
- {name: Jirou, score: [4, 2, 3, 4], param: {str: 11, int: 3}}
- {name: Saburou, score: [5, 2, 3, 4], param: {str: 12, int: 1}}
EOS
p obj

実行すると

[{"score"=>[1, 2, 3, 4], "name"=>"Tarou", "param"=>{"int"=>4, "str"=>10}}, {"score"=>[4, 2, 3, 4], "name"=>"Jirou", "param"=>{"int"=>3, "str"=>11}}, {"score"=>[5, 2, 3, 4], "name"=>"Saburou", "param"=>{"int"=>1, "str"=>12}}]

ちゃんとなってる。

コメント

#から後。
それだけ。

  • 整数
    • 12や3みたいなの
  • 浮動小数
    • 1.2や3.141592みたいなの
  • 真偽値
    • true, false, yes, no
  • Null
    • null, ~
  • 日付
    • 2000-01-01みたいなの
  • タイムスタンプ
    • yyyy-mm-dd hh:mm:ss:[+-]hh:mmらしい

なが〜い文字列

複数行にわたる文字列も定義できる。
書き方は|や>を使う。

require 'yaml'

obj = YAML.load(<<-EOS)
- |
  aaa
  eee

- >
  aiueo
  kakikukeko
EOS
p obj

実行結果

["aaa\neee\n", "aiueo kakikukeko\n"]
だと改行は改行のままで>だと改行は半角スペース!

大体こんな感じかな?

の後に+や-や数字を指定することでも、ちょっと動きがかわるらしい。

とりあえず俺には必要性感じないからいいや。