使用ruby迭代yaml数组
我将使用ruby迭代yaml数组,ruby,arrays,Ruby,Arrays,我将YAML.load_文件应用于我的示例文件: --- languages: - name: "English" iso_639: "en" native_name: "English" region: - '' - UK - US - name: "Klingon" iso_639: "tlh" native_name: "tlhIngan Hol" region: - notearth
YAML.load_文件应用于我的示例文件:
---
languages:
- name: "English"
iso_639: "en"
native_name: "English"
region:
- ''
- UK
- US
- name: "Klingon"
iso_639: "tlh"
native_name: "tlhIngan Hol"
region:
- notearth
我想迭代这些语言和区域数组。这不起作用:
records.each do |record|
record.region.each do |region|
self.create!
end
end
record.region
为区域提供未知方法错误。如何迭代语言及其区域?或者,如何访问区域数组?Yaml被加载到哈希中,因此其形式如下:
languages: [
{
name: "English"
iso_639: "en"
native_name: "English"
region: ['', 'UK', 'US']
}
{
name: "Klingon"
iso_639: "tlh"
native_name: "tlhIngan Hol"
region: ['notearth']
}]
所以你需要像这样迭代:
results = YAML.load_file(file)
results['languages'].flat_map{|l| l['region']}.each do |region|
self.create!
end
您的代码中有两个错误:
加载YAML文件后得到的对象不是数组,而是散列,比如文件名为foo.yml
:
YAML.load_file('foo.yml')
# => {"languages"=>[{"name"=>"English", "iso_639"=>"en", ...
因此,您必须按如下方式修改代码以使其正常工作:
records['languages'].each do |record|
# ...
region
不是散列记录的方法,它是一个键,您必须使用record['region']
访问相关值
您必须使用的正确代码是:
records['languages'].each do |record|
record['region'].each do |region|
# My guess is you are going to use `region` inside this block
self.create!
end
end
“这不管用”到底是什么意思?你有错误吗?您得到的结果不是您期望的结果?我编辑了我的问题,以便将实际问题最小化。Symbol是Rails扩展吗?@WayneConrad是的,它是Hanks。我提到它是因为OP没有用Rails标记这个问题。当然,大多数Ruby问题都是关于Rails的。@WayneConrad-确实如此。我假设这是针对rails应用程序的(因为self.create!
。如果不是,不使用它和使用字符串就可以了。我会更新答案。我建议使用flat\u map{…}
而不是map{…}。flatte
。
CONFIG = YAML.load_file("file.yml")
puts CONFIG # {"languages"=>[{"name"=>"English", "iso_639"=>"en", "native_name"=>"English", "region"=>["", "UK", "US"]}, {"name"=>"Klingon", "iso_639"=>"tlh", "native_name"=>"tlhIngan Hol", "region"=>["notearth"]}]}
CONFIG['languages'].map{|l| l['region']}