使用Ruby迭代一个YAML数组

3

我对我的示例文件使用了 YAML.load_file

---
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 给我返回了未知方法错误。我该如何遍历语言和它们的区域呢?或者说,我该如何访问区域数组呢?


1
你所说的“这不起作用”具体是什么意思?你遇到了错误吗?还是得到的结果与你期望的不同? - toro2k
我编辑了我的问题,以便缩小实际问题的范围。 - Denny Mueller
3个回答

3

你的代码中有两个错误:

  1. The object you get after loading the YAML file is not an array, it's a hash, say the file is called foo.yml:

    YAML.load_file('foo.yml')
    # => {"languages"=>[{"name"=>"English", "iso_639"=>"en", ...
    

    Thus you have to modify your code like the following to make it work:

    records['languages'].each do |record|
      # ...
    
  2. region is not a method of the hash record, it is a key, you have to access the related value using 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

2
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

#symbolize_keys是Rails的扩展吗? - Wayne Conrad
@WayneConrad 是的,没错 - DickieBoy
@WayneConrad - 是的。我假设这是用于Rails应用程序(因为有self.create!)。如果不是,那么不使用它并使用字符串也可以。我会更新答案。 - BroiSatse
@BroiSatse 哦,好发现。我错过了调用self.create的含义。 - Wayne Conrad
2
我建议使用 flat_map{...} 而不是 map{...}.flatten - toro2k
显示剩余2条评论

0
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']}

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