Verwenden Sie einen Codeblock in YAML erneut

77

Ich möchte einen Hash in YAML wiederverwenden :

Defaults: &defaults
  Company: Foo
  Item: 123

Computer: *defaults
  Price: 3000

Dies erzeugt jedoch einen Fehler.

Ist der einzige Weg , um jedes Feld Wert separat zu verankern , wie dies ?

Defaults:
  Company: &company Foo
  Item: &item 123

Computer:
  Company: *company
  Item: *item
  Price: 3000
Ajsie
quelle

Antworten:

28
# sequencer protocols for Laser eye surgery
---
- step:  &id001                  # defines anchor label &id001
    instrument:      Lasik 2000
    pulseEnergy:     5.4
    pulseDuration:   12
    repetition:      1000
    spotSize:        1mm

- step: &id002
    instrument:      Lasik 2000
    pulseEnergy:     5.0
    pulseDuration:   10
    repetition:      500
    spotSize:        2mm

- step: *id001                   # refers to the first step (with anchor &id001)
- step: *id002                   # refers to the second step
- step: *id001
- step: *id002

Beispiel aus Wikipedia

zed_0xff
quelle
4
Die Antwort von Gabriel ist ein besserer Weg, um dieses Problem zu lösen. Sie können eine ganze Gruppe wiederverwenden und dann die Felder (auch tiefe Felder) überschreiben, die Sie unterscheiden möchten.
Luca Spiller
282

Versuchen Sie, eine vollständige Gruppe wiederzuverwenden, indem Sie sie importieren:

Defaults: &defaults
  Company: foo
  Item: 123

Computer:
  <<: *defaults
  Price: 3000

Dokumentation: http://yaml.org/type/merge.html

Gabriel Oliveira
quelle
5
Ich vergesse diese Syntax immer, sie ist etwas kompliziert.
Websites
Gibt es eine Dokumentation, auf die Sie dazu verlinken können? Ich würde gerne sehen, ob es eine ähnliche Funktion für Listen gibt.
wasserdicht
7
Für ein DSL, das angeblich leicht zu lesen und zu verstehen ist, ist diese Syntax notorisch kompliziert und unlesbar. Dann würden Sie denken, das Lesen der Dokumente / Spezifikationen würde es klären, aber nein, Sie würden ein tiefes Loch in Ihrem Kopf haben, wenn Sie versuchen, die Spezifikation zu entschlüsseln.
Christian
Ich würde so weit gehen zu argumentieren, dass dies ein Ort wäre, an dem Code-Duplizierung besser ist - und ich hasse Duplizierung im Allgemeinen.
Christian
Diese Antwort zeigt genau, wie es funktioniert. Und die Verwendung von zwei Zeichen ist nicht kompliziert! Ein &mit einem Namen zum Markieren eines Abschnitts und ein *mit demselben Namen zum Abrufen. Das ist sehr einfach. Sie markieren eine Zeile mit &name, und alles, was unter dieser Zeile verschachtelt ist, wird mit wiederverwendet *name. Vielen Dank für diesen Beitrag, er ist sehr hilfreich, obwohl diese Kommentare
besagen,