YAML读取应该是Hash而不是数组,出了什么问题?

时间:2015-01-22 19:10:33

标签: ruby yaml

我正在阅读YAML文件:

listing = YAML.load_file(File.expand_path(....)

我尝试在构建OpenStructure上迭代列表项

items = Array.new
listing.each do |item|
  items << OpenStruct.new(item)
end

但它引发了一个错误:

undefined method `each_pair' for ["item1", "label1"]:Array (NoMethodError)

我的测试YAML文件是:

item1: label1
item2: label2

我做错了什么?

1 个答案:

答案 0 :(得分:1)

OpenStruct initializer中出现错误。

当你调用Hash#each并给它一个arity = 1的块时,该块会得到一个像[key, value]这样的数组。然后,您将其传递给OpenStruct.new,这会导致错误,因为您无法使用OpenStruct初始化Array

我想要你想要的是:

listing.each do |key, value|
  items << OpenStruct.new({ key: value })
end

或者,yaml文件可以是

- item1: label1
- item2: label2

我相信代码会按原样运行。

您拥有的YAML文件被反序列化为:

{ item1: "label1", item2: "label2" }

而我所描述的那个将是:

[{ item1: "label1" }, { item2: "label2" }]