YAML:将数组存储为变量

时间:2014-12-11 14:44:20

标签: ruby yaml

我刚刚开始学习YAML,而我并没有真正找到一些我想要完成的最佳实践。基本上,我的YAML文件中有一个对象数组,为了生产,我想再添加一个这个数组的条目。所以我基本上想要这样的东西(它是伪代码,因为我知道它不是有效的YAML):

development:
  array: &ARRAY
  - name: item1
    value: value1
  - name: item2
    value: value2

production:
  <<: *ARRAY
  array:
  - name: item3
    value: value3

目前,我正在用Ruby解析我的YAML文件,所以我决定在Ruby中处理这个逻辑。我正在做这样的事情:

yaml_contents = YAML::load(yaml_string)
prod_values = yaml_contents['production']
prod_values['array'].push({:name => 'item3', :value => 'value3'})

然而,这可能会使我的加载脚本非常毛茸茸。有没有更好的设计方法?

我相信this question是相关的。

1 个答案:

答案 0 :(得分:1)

<<语法用于合并地图(即哈希),而不是序列。你可以这样做:

development: &ARRAY
  - name: item1
    value: value1
  - name: item2
    value: value2

production:
  - *ARRAY
  - name: item3
    value: value3

加载时,production数组将有一个嵌套数组,因此您需要使用flatten

yaml_contents = YAML::load(yaml_string)
prod_values = yaml_contents['production'].flatten

如果您的实际数据可能涉及嵌套哈希,并且您只想展平在Yaml中显示为别名的任何数组,您可以编写自己的Psych访客(可能是Psych::Visitors::ToRuby的子类)并将它们合并为你创建了对象图,但我怀疑在这种情况下简单地调用flatten就足够了。