YAML 读取应该是哈希而不是数组,有什么问题吗?

YAML read should be an Hash not an Array, what's wrong?

我正在读取 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

我做错了什么?

错误发生在 OpenStruct initializer

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

初始化 OpenStruct

认为你想要的是:

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" }]