2012-02-22 31 views
3

私はYAMLファイルに2人の父親がいますが、1人の家族だけが出てきます。サムに何が起こったのですか?私はどのようにして両方を得るのですか?Ruby:YAMLからハッシュの配列を読み取る

## dads.rb 
require 'yaml' 
require 'pp' 

dad=[] 

dad[0] = {:name => "Joe", :kids => ["Mary", "John"]} 
dad[1] = {:name => "Sam", :kids => ["Sam Jr", "Samantha", "Samizdat"]} 

open('dads.yml' , 'w') do |f| 
    dad.each do |d| 
     f.write YAML::dump(d) 
    end 
end 

family = [] 
open('dads.yml') do |f| 
    family << YAML::load(f.read) 
end 

pp fams 
+0

に忘れてはいけませんが、[答えを受け入れる](のhttp:// meta.stackexchange.com/a/5235/176476):) –

答えて

7

複数のYAMLドキュメントをダンプしますが、1つだけ読み戻します。代わりに、配列全体をダンプして読み取ることができます:

require 'yaml' 

dads = [] 
dads << {:name => "Joe", :kids => ["Mary", "John"]} 
dads << {:name => "Sam", :kids => ["Sam Jr", "Samantha", "Samizdat"]} 

open('dads.yml', 'w') { |f| YAML::dump(dads, f) } 

family = YAML::load(File.read('dads.yml')) 

p family 
2

あなたのコードは現在、YAML出力内に別々の「ドキュメント」を作成しています。デフォルトでは、YAML::loadは最初のドキュメントを読み込むだけです。ニクラス答えは間違いなくあなたが行くべき道ですが、あなたは絶対に複数の文書に対処しなければならなかった場合、あなたはload_documents方法使用できます

family = YAML.load_documents(File.read("dads.yml")) 
# => [{:name=>"Joe", :kids=>["Mary", "John"]}, {:name=>"Sam", :kids=>["Sam Jr", "Samantha", "Samizdat"]}] 
+0

知っておきたいこと:) 'each_document'を動作させようとしましたが、新しいYAML実装では利用できないようです。私が見た最高のものではありません。 –

+0

古いエンジン(syck)でも、 'each_document'は廃止されましたが、とにかく' load_documents'と呼ばれました。 Psychは 'load_documents'だけを処理します。 –

+0

ああ私は複数の文書を作成していたことが分かります。それぞれのオペレータは助けなかった。今は終わった。ありがとう。 – dcvii

関連する問題