3

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

所需的 YAML:

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

红宝石代码:

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

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

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

我看过在不破坏锚点和别名的情况下读写 YAML 文件?它的亲戚,在其他地方,但还没有找到答案——至少不是我所理解的。

谢谢!

4

1 回答 1

4

如果您使用相同的 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

不过,我不确定是否有一种直接的方法来定义作为彼此子集的哈希。也许稍微调整一下你的结构是有道理的?

于 2013-01-30T18:31:07.833 回答