3

連動構造の大きなハッシュ(>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'

Hashビルダーやエミッターなどをいじくり回すのではなく、ネイティブのRubyプリミティブ型(など)で可能な限り作業したいのですが、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 に答える