Ruby 1.8.7 リファレンスマニュアル > ライブラリ一覧 > yamlライブラリ > YAMLモジュール
クラスの継承リスト: YAML
YAML (YAML Ain't Markup Language) を扱うモジュールです。
add_builtin_type(type_tag) {|type, val| ...} -> nil
[permalink][rdoc]yaml.org,2002ドメインに属しているクラスをYAMLに追加し そのクラスを見つけたときの操作を指定します。
require 'yaml' str1=<<EOT --- !ruby.yaml.org,2002/Rational 5/6 EOT str2=<<EOT --- !yaml.org,2002/Rational 3/4 EOT p YAML.load(str1) #=> #<YAML::DomainType:0x2b07528 @type_id="Rational", @domain="ruby.yaml.org,2002", @value="5/6"> p YAML.load(str2) #=> #<YAML::DomainType:0x2b0767c @type_id="Rational", @domain="yaml.org,2002", @value="3/4"> YAML.add_builtin_type("Rational"){|type, val| md = val.split(/\//) Rational.new!(md[0].to_i, md[1].to_i) } p YAML.load(str1) #=> #<YAML::DomainType:0x2b06fec @type_id="Rational", @domain="ruby.yaml.org,2002", @value="5/6"> ## 前回と変化なし rt = YAML.load(str2) p rt # => Rational(3, 4) p rt + 0.25 # => 1.0
add_domain_type(domain, type_tag) {|type, val| ...} -> nil
[permalink][rdoc]YAMLドメインに属しているクラスをYAMLに追加し、 そのクラスを見つけたときの操作を指定します。
require 'yaml' class Person attr_accessor :name, :age end str=<<EOT --- !Qjitsu.com,2007-05-04/Person name: eiji age: 33 EOT YAML.each_document(str){|obj| p obj } #=> #<YAML::DomainType:0x2b07974 @type_id="Person", @domain="Qjitsu.com,2007-05-04", @value={"name"=>"eiji", "age"=>33}> # YAML.add_domain_type( "Qjitsu.com,2007-05-04", "Person" ) { |type, val| YAML.object_maker( Person, val ) } YAML.each_document(str){|obj| p obj } #=> #<Person:0x2b0762c @age=33, @name="eiji">
add_private_type(type_re) {|type, val| ...} -> nil
[permalink][rdoc]プライベートタイプのクラスをYAMLに追加し、 そのクラスを見つけたときの操作を指定します。
require 'yaml' class Person ; end str1=<<EOT --- !!Person name: taro country: Japan capital: Tokyo EOT YAML.each_document(str1){|obj| p obj } #=> #<YAML::PrivateType:0x2b07a14 @type_id="Person", @value={"name"=>"taro", "country"=>"Japan", "capital"=>"Tokyo"}> YAML.add_private_type("Person"){|type, val| YAML.object_maker(Person, val) } YAML.each_document(str1){|obj| p obj } #=> #<Person:0x2b07640 @country="Japan", @capital="Tokyo", @name="taro"> str2=<<EOT --- !Qjitsu.com,2007-05-04/Person name: eiji age: 33 --- !!Person name: ichiro country: Japan capital: Tokyo EOT YAML.each_document(str2){|obj| p obj } #=> #<YAML::DomainType:0x2b071a4 @type_id="Person", @domain="Qjitsu.com,2007-05-04", @value={"name"=>"eiji", "age"=>33}> #=> #<Person:0x2b06eac @country="Japan", @capital="Tokyo", @name="ichiro">
add_ruby_type(type_tag) {|type, val| ...} -> nil
[permalink][rdoc]rubyタイプのクラスをYAMLに追加し、 そのクラスを見つけたときの操作を指定します。
require 'yaml' class Dog attr_accessor :name def initialize(name) @name = name end end str1=<<EOT --- !ruby/Dog name: pochi --- !!Dog age: 0.5 --- !Qjitsu.com,2007-05-06/Dog preference: apple EOT YAML.add_ruby_type("Dog") do |type, val| YAML.object_maker(Dog, val) end YAML.each_document(str1){|dog| p dog.class p dog.respond_to?(:name) } #=> Dog #=> true #=> YAML::PrivateType #=> false #=> YAML::DomainType #=> false
detect_implicit(val) -> String
[permalink][rdoc]タグを省略した値の型を判定します。
require 'yaml' p YAML.detect_implicit("") # => "null" p YAML.detect_implicit("Cat") # => "str" p YAML.detect_implicit("true") # => "bool#yes" p YAML.detect_implicit("10") # => "int" p YAML.detect_implicit("0x10") # => "int#hex"
dump(obj, io = nil) -> String | IO
[permalink][rdoc]与えられた obj を YAML フォーマットに変換し、io に書き込みます。io を返 します。io が与えられていない場合は、YAML フォーマットの文字列を返しま す。
YAML.dump( ['badger', 'elephant', 'tiger'], File.open('sample.yml', 'w') )
dump_stream(*objs) -> String
[permalink][rdoc]与えられた objs を順に YAML フォーマットに変換していき、一つの文字列にまとめたものを返します。
require "yaml" puts YAML.dump_stream( "hoge\nfoo", [1,2], {"foo" => "bar"} ) --- |- hoge foo --- - 1 - 2 --- foo: bar
each_document(io) {|obj| ...} -> nil
[permalink][rdoc]load_documents(io) {|obj| ...} -> nil
与えられた io から YAML フォーマットの文書をすべて順に読み込み Ruby のオブジェクトに変換し、 生成したオブジェクトを引数としてブロックを評価していきます。
# sample.yml - apple - banana - carrot --- foo: bar #!/usr/bin/env ruby require "yaml" File.open( 'sample.yml' ) do |io| YAML.load_documents(io){|y| p y } end #=> ["apple", "banana", "carrot"] #=> {"foo"=>"bar"}
[注意] ブロックを指定しないと NoMethodError が発生する事に注意してください。
each_node(io) {|obj| ...} -> nil
[permalink][rdoc]与えられた io から YAML フォーマットの文書をすべて順に読み込み YAML::Syck::Map オブジェクトに変換し、 生成したオブジェクトを引数としてブロックを評価していきます。
food: - apple - banana - carrot --- foo: bar # end of test.yml require 'yaml' File.open( 'test.yml' ) do |io| YAML.each_node(io) do |y| p y.transform end end #=> {"food"=>["apple", "banana", "carrot"]} #=> {"foo"=>"bar"}
emitter -> YAML::Syck::Emitter
[permalink][rdoc]YAML を出力するためのオブジェクトを返します。
generic_parser -> YAML::Syck::Parser
[permalink][rdoc]YAML パーサを返します。ただし、YAML.parser とは異なり、リゾルバに YAML::Syck::GenericResolver が指定されています。
[SEE_ALSO] YAML.parser
load(io) -> object
[permalink][rdoc]load(str) -> object
YAML フォーマットの文書を読み込み Ruby のオブジェクトを生成して返します。 引数として IO オブジェクトと文字列を受け付けます。 io や 文字列が複数の YAML ドキュメントを含んでいても、最初のものしか Ruby のオブジェクトに変換しません。
$ ruby-1.8 -ryaml -e ' p YAML.load(<<HERE) - apple - banana - carrot --- foo: bar HERE ' ["apple", "banana", "carrot"]
load_file(file) -> object
[permalink][rdoc]与えられた名前のファイルから YAML フォーマットの文書を読み込み Ruby のオブジェクトを生成して返します。 ファイルが複数の YAML ドキュメントを含んでいても、 最初のものしか Ruby のオブジェクトに変換しません。
--- - Monday - - 国語 - 算数 - 理科 - 社会 - 体育 --- - Friday - - 体育 - 算数 - 理科 - 国語 - 社会 #end of jikanwari.yaml require 'yaml' puts YAML.load_file('jikanwari.yaml').join(",") #=> Monday,国語,算数,理科,社会,体育
load_stream(io) -> object
[permalink][rdoc]与えられた io から YAML フォーマットの文書を すべて順に読み込んで Ruby のオブジェクトに変換していき、 それらオブジェクトを含んだ YAML::Stream を返します。
require 'yaml' class Dog attr_accessor :name def initialize(name) @name = name end end str1=<<EOT --- !ruby/Dog name: pochi --- !!Dog age: 0.5 EOT YAML.add_ruby_type("Dog") do |type, val| Dog.new(val["name"]) end ys = YAML.load_stream(str1) p ys #=> #<YAML::Stream:0x2b079d8 @options={}, @documents=[#<Dog:0x2b079c4 @name="pochi">, #<YAML::PrivateType:0x2b07780 @value={"age"=>0.5}, @type_id="Dog">]> ys.edit(1, Dog.new("tama")) p ys.documents #=> [#<Dog:0x2b079b0 @name="pochi">, #<Dog:0x2b0762c @name="tama">]
object_maker(obj_class, val, is_attr = false) -> object
[permalink][rdoc]与えられたobj_class クラスに、valハッシュをインスタンス変数として追加し obj_classクラスのインスタンスを生成して返します。
require 'yaml' class Cat; end YAML.load_documents(DATA){|y| p YAML.object_maker(Cat, y) } __END__ name: taro age: 13 --- name: jiro age: 23 --- name: saburo age: 8 # end of sample 結果 #=> #<Cat:0xb7ccb174 @name="taro", @age=13> #=> #<Cat:0xb7ccafa8 @name="jiro", @age=23> #=> #<Cat:0xb7ccaad0 @name="saburo", @age=8>
parse(io) -> YAML::Syck::Node
[permalink][rdoc]与えられた io から YAML フォーマットの文書をパースし YAML::Syck::Node かそのサブクラスのオブジェクトに変換します。 複数のドキュメントを読み込む場合は、YAML.parse_documents を使用します。
#!/usr/bin/env ruby require 'yaml' doc = YAML.parse(DATA) doc.search("//name").each {|node| p node } __END__ cat: - name: taro age: 7 - name: jiro age: 23 --- dog: shiba: - name: goro age: 3 - name: rokuro age: 1 # end of sample #=> "/cat/0/name" #=> "/cat/1/name" # dog は読み込まない
parse_documents(io) {|obj| ...} -> nil
[permalink][rdoc]与えられた io から YAML フォーマットの文書をパースし YAML::Syck::Nodeオブジェクトに変換し、 生成したオブジェクトを引数としてブロックを評価していきます。
require 'yaml' YAML.parse_documents(DATA){|doc| doc.search('/dog//name').each {|node| p node } p "-->" } __END__ cat: - name: taro age: 7 - name: jiro age: 23 --- dog: shiba: - name: goro age: 3 - name: rokuro age: 1 # end of sample #=> "-->" #=> "/dog/shiba/0/name" #=> "/dog/shiba/1/name" #=> "-->"
[注意] ブロックを指定しないと NoMethodError が発生する事に注意してください。
parse_file(file_path) -> YAML::Syck::Node
[permalink][rdoc]file_pathのファイルから一つのYAMLドキュメントをパースし、 YAML::Syck::Nodeオブジェクトを返します。
cat: - name: taro age: 7 - name: jiro age: 23 --- dog: shiba: - name: goro age: 3 - name: rokuro age: 1 # end of sample.yaml require 'yaml' tree = YAML.parse_file("sample.yaml") p tree.transform #=> {"cat"=>[{"name"=>"taro", "age"=>7}, {"name"=>"jiro", "age"=>23}]}
parser -> YAML::Syck::Parser
[permalink][rdoc]YAML パーサを返します。
[SEE_ALSO] YAML.generic_parser
quick_emit(oid, opts={}) {|obj| ...} -> String
[permalink][rdoc]ライブラリ内部で使用します。
read_type_class(type, obj_class) -> [String, Class]
[permalink][rdoc]ライブラリ内部で使用します。
resolver -> YAML::Syck::DefaultResolver
[permalink][rdoc]タグ URI との関連付けを解決するリゾルバを返します。
tagurize(val) -> String
[permalink][rdoc]val で指定したタグを元にタグ URI を作成します。
例:
require 'yaml' YAML.tagurize("str") # => "tag:yaml.org,2002:str" YAML.tagurize("ruby/sym") # => "tag:ruby.yaml.org,2002:sym" YAML.tagurize("tag:ruby.yaml.org,2002:sym") # => "tag:ruby.yaml.org,2002:sym"
transfer(type_id, obj) -> object
[permalink][rdoc]ライブラリ内部で使用します。
try_implicit(obj) -> object
[permalink][rdoc]ライブラリ内部で使用します。