あーるPG - 社会人のデジタル生活

日曜プログラマになろうかなーと思った30代理系社会人の、キャリアアップや趣味(特にデジタル情報)の記録。らーめんとビールが好き。

YAMLを用いた状態の保存、復帰

require 'yaml'

hash_data = {
  "item1" => "hoge",
  "item2" => "fuga",
}
array_data = [
  1,
  2,
  [31, 32]
]

# 保存
f = open("config.yaml", "w")
f.write(YAML.dump(hash_data))
f.write(array_data.to_yaml)  #YAML.dumpと同等
f.close


# 復帰
#   YAMLが1ブロックの場合
printf "\n---case of 1 block---\n"
p array_data2 = YAML.load_file("config.yaml")

#   複数ブロックの場合
printf "\n---case of n blocks---\n"
str = open("config.yaml", "r").read
stream = YAML.load_stream(str).documents.each{|doc|
  p doc
}

実行結果

$ ./test.rb  hoge.yaml

 case of 1 block
{"item1"=>"hoge", "item2"=>"fuga"}

 case of n blocks
{"item1"=>"hoge", "item2"=>"fuga"}
[1, 2, [31, 32]]

ファイルの中身(YAMLフォーマット)

---
item1: hoge
item2: fuga
---
- 1
- 2
- - 31
  - 32

ルビリストマガジンの中級編までの抜粋。
データの保存、復帰(シリアライズ、デシリアライズ)はYAMLでやると便利らしい。
YAMLは簡潔で可読性が高いから。中間フォーマットとして使ったりもできるんだろう。
ま、簡単なところでここら辺から、ということ。
YAMLは行頭が”- ”のときは配列、"〜: 〜"という形のときはハッシュ。先頭に半角スペースを入れることで入れ子にできる。記号の後に半角スペースを入れることに注意する。"---"はブロック区切り。数、文字列などは自動的に判別されるが、"- !str 3.14"などと明示的に指定することも可能。