【问题标题】:YAML: Store array as variableYAML:将数组存储为变量
【发布时间】:2015-02-10 02:13:06
【问题描述】:

我刚刚开始学习 YAML,我并没有真正为我想要完成的事情找到最佳实践。基本上,我的 YAML 文件中有一个对象数组,对于生产,我想在这个数组中再添加 1 个条目。所以我基本上想要这样的东西(它是伪代码,因为我知道它不是有效的 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 是相关的。

【问题讨论】:

  • 好的..现在我明白了。已删除我的答案。
  • yaml中没有办法合并序列,但是可以用hash代替
  • 但是用散列代替意味着我必须有不同的键,这在需要如何设计的情况下是不可能的。

标签: ruby yaml


【解决方案1】:

&lt;&lt; 语法用于合并映射(即哈希),而不是序列。你可以这样做:

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 就足够了。

【讨论】:

  • 我认为你是绝对正确的......我相信这就是答案。我将首先进行一些更广泛的测试。谢谢!
  • 这正是我想要的。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2015-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-02
相关资源
最近更新 更多