Ruby:从YAML中读取哈希数组

3

我在YAML文件中输入了两个“dads”,但只有一个家庭被输出了。Sam去哪了?我该如何让两个家庭都输出?

## 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
2个回答

7
您可以将多个YAML文档转储,但只读取一个。相反,您可以转储并读取整个数组:
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只会读取第一个文档。Niklas的答案绝对是您应该采用的方式,但如果您绝对必须处理多个文档,则可以使用load_documents方法:

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

好的,知道了 :) 我刚试图让 each_document 起作用,但在新的 YAML 实现中似乎不可用。文档并不是我见过的最好的。 - Niklas B.
即使在老引擎(Syck)中,each_document也已被弃用,并且实际上只是调用load_documents。Psych仅处理load_documents - Dylan Markow
啊,我发现我创建了多个文档。.each操作符没有帮助。现在完成了。谢谢。 - dcvii

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接