Ruby 1.8.7 リファレンスマニュアル > ライブラリ一覧 > yamlライブラリ
構造化されたデータを表現するフォーマットであるYAML (YAML Ain't Markup Language) を扱うためのライブラリです。
例1: 構造化された配列
require 'yaml' data = [ "Taro san", "Jiro san", "Saburo san"] str_r = YAML.dump(data) str_l =<<EOT --- - Taro san - Jiro san - Saburo san EOT p str_r == str_l #=> true
例2: 構造化されたハッシュ
require 'yaml' require 'date' str_l =<<YAML_EOT Tanaka Taro: { age: 35, birthday: 1970-01-01} Suzuki Suneo: { age: 13, birthday: 1992-12-21 } YAML_EOT str_r = {} str_r["Tanaka Taro"] = { "age" => 35, "birthday" => Date.new(1970, 1, 1) } str_r["Suzuki Suneo"] = { "age" => 13, "birthday" => Date.new(1992, 12, 21) } p str_r == YAML.load(str_l) #=> true
例3: 構造化されたログ
require 'yaml' require 'stringio' strio_r = StringIO.new(<<EOT --- time: 2008-02-25 17:03:12 +09:00 target: YAML version: 4 log: | 例を加えた。 アブストラクトを修正した。 --- time: 2008-02-24 17:00:35 +09:00 target: YAML version: 3 log: | アブストラクトを書いた。 EOT ) YAML.load_stream(strio_r).documents.sort{|a, b| a["version"] <=> b["version"]}.each{|obj| printf "version %d\ntime %s\ntarget:%s\n%s\n", obj["version"], obj["time"], obj["target"], obj["log"] }
yaml ライブラリでは、以下のライブラリをバックエンドとして使用します。
!ruby/sym :foo などのようにタグを指定することで、読み込み時に記述した値 の型を指定できます。
例:
require 'yaml' p YAML.load(<<EOS) --- !ruby/sym :foo EOS # => :foo
yaml では、Ruby 向けに以下のローカルタグを扱えます。
例:
require 'yaml' p YAML.load(<<EOS) --- array: !ruby/array [1, 2, 3] hash: !ruby/hash {foo: 1, bar: 2} regexp: !ruby/regexp /foo|bar/ range: !ruby/range 1..10 EOS # => {"regexp"=>/foo|bar/, "hash"=>{"foo"=>1, "bar"=>2}, "array"=>[1, 2, 3], "range"=>1..10}
これらは tag:ruby.yaml.org,2002:array のように指定する事もできます。
例:
require 'yaml' p YAML.load(<<EOS) --- array: !tag:ruby.yaml.org,2002:array [1, 2, 3] hash: !tag:ruby.yaml.org,2002:hash {foo: 1, bar: 2} EOS # => {"hash"=>{"foo"=>1, "bar"=>2}, "array"=>[1, 2, 3]}
自分で定義したクラスなどは !ruby/object:<クラス名> を指定します。なお、 読み込む場合には既にそのクラスが定義済みでないと読み込めません。
また、キーと値を指定する事でインスタンス変数を代入できます。
例1:
require 'yaml' class Foo def initialize @bar = "test" end end p YAML.load(<<EOS) --- !ruby/object:Foo bar: "test.modified" EOS # => #<Foo:0xf743f754 @bar="test.modified">
例2:
require 'yaml' module Foo class Bar end end p YAML.load(<<EOS) --- !ruby/object:Foo::Bar EOS # => #<Foo::Bar:0xf73907b8>
また、YAML 形式に変換する際のタグを変更したい場合、to_yaml_type メソッ ドをオーバライドしてください。
例:
require "yaml" class Foo def to_yaml_type return "!tag:example.com,2002:foo" end end p Foo.new.to_yaml # => "--- !example.com,2002/foo {}\n\n"
無名クラスを YAML 形式に変換すると TypeError が発生します。また、 IO や Thread オブジェクトなどはインスタンス変数がオブジェク トの状態を保持していないため、変換はできますが、YAML.load した時に完全 に復元できない事に注意してください。
標準添付の yaml 関連ライブラリには以下のようなRuby 独自の拡張、制限があ ります。標準添付ライブラリ以外で yaml を扱うライブラリを使用する場合な どに注意してください。
YAML Specification
YAML4R
Rubyist Magazine: http://magazine.rubyist.net/
その他
YAML::Stream | YAML ドキュメントを複数保持することができるストリームクラスです。 |
YAML | YAML (YAML Ain't Markup Language) を扱うモジュールです。 |
YAML::Error | 意図しない入力がメソッドに与えられた時などに発生します。 |
YAML::ParseError | 将来のために予約されています。現在は発生しません。 |
YAML::TypeError | 意図しない入力がメソッドに与えられた時などに発生します。 |
stringio | 文字列に IO と同じインタフェースを持たせるためのライブラリです。 |
yaml/constants | YAML 関連の定数のためのサブライブラリです。 |
yaml/error | YAML 関連のエラーを扱うためのサブライブラリです。 |
yaml/stream | 複数の YAML ドキュメントを一度に扱うためのサブライブラリです。 |
yaml/tag | タグ URI とクラスを関連付けるためのサブライブラリです。 |
yaml/basenode | YAML のノードを検索するためのサブライブラリです。 |
yaml/dbm | DBM の値に文字列以外も格納できるように拡張するためのサブライブラ リです。 |
yaml/rubytypes | Ruby の組み込みクラスのいくつかを YAML に変換するためのサブライブラリで す。 |
yaml/store | RubyのオブジェクトをYAML形式の外部ファイルに格納するためのクラスです。 |
yaml/stringio | stringio ライブラリが使用できない環境を補助するためのサブライブ ラリです。 |
yaml/yamlnode | YAML のノードを表現するためのサブライブラリです。 |
yaml/ypath | YAML ドキュメントから特定のデータを検索する機能を提供するサブライブラリ です。 |