注释Ruby结构以包含#to_yaml上的锚点/引用

时间:2013-01-30 18:17:15

标签: ruby hash yaml

我有一些带有互锁结构的大型哈希(>10⁵键)。它们作为YAML存储在磁盘上。我想通过在YAML中使用锚点和引用来避免重复,但我无法弄清楚是否有一种方法可以在哈希中隐式执行它,以便#to_yaml方法将标记锚点节点正确。

所需的YAML:

--- 
parent1:
  common-element-1: &CE1
    complex-structure-goes: here
parent2:
  uncomment-element-1:
    blah: blah
  <<: *CE1

Ruby代码:

hsh = {
  'parent1' => {
    'common-element-1' => {
      'complex-structure-goes' => 'here',
    },
  'parent2' => {
    'uncommon-element-1' => {
      'blah' => 'blah',
    },
    '<<' => '*CE1',
  },
}

引用非常简单 - 但是如何在Ruby哈希中的&CE1项中嵌入'common-element-1'锚点?

我希望尽可能多地使用原生Ruby原语类型(如Hash),而不是使用构建器和发射器等等 - 而且我绝对不想要手动编写YAML!

我看过Read and write YAML files without destroying anchors and aliases?its relative以及其他地方,但还没有找到答案 - 至少不是我理解的。

谢谢!

1 个答案:

答案 0 :(得分:2)

如果您使用相同的Ruby对象,YAML库将为您设置引用:

> common = {"ohai" => "I am common"}
> doc = {"parent1" => {"id" => 1, "stuff" => common}, "parent2" => {"id" => 2, "stuff" => common}}
> puts doc.to_yaml
---
parent1:
  id: 1
  stuff: &70133422893680
    ohai: I am common
parent2:
  id: 2
  stuff: *70133422893680

我不确定是否有一种简单的方法来定义彼此为子集的哈希。也许有必要调整你的结构?