Sử dụng lại một khối mã trong YAML


79

Tôi muốn sử dụng lại hàm băm trong YAML :

Defaults: &defaults
  Company: Foo
  Item: 123

Computer: *defaults
  Price: 3000

Tuy nhiên, điều này tạo ra một lỗi.

Có phải cách duy nhất để neo từng giá trị trường riêng biệt như thế này không?

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

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

Câu trả lời:


29
# 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

mẫu từ wikipedia


4
Câu trả lời của Gabriel là một cách tốt hơn để giải quyết vấn đề này. Bạn có thể sử dụng lại toàn bộ nhóm, sau đó ghi đè các trường (thậm chí cả trường sâu) mà bạn muốn khác.
Luca Spiller

288

Hãy thử sử dụng lại một nhóm đầy đủ bằng cách nhập nhóm đó:

Defaults: &defaults
  Company: foo
  Item: 123

Computer:
  <<: *defaults
  Price: 3000

Tài liệu: http://yaml.org/type/merge.html


5
Tôi luôn quên cú pháp này, nó hơi phức tạp.
trang web ngày

Có tài liệu nào bạn có thể liên kết cho việc này không? Tôi muốn xem liệu danh sách có tính năng tương tự không.
không thấm nước

8
Đối với một DSL được cho là dễ đọc và dễ hiểu, cú pháp này nổi tiếng là phức tạp và khó đọc. Sau đó, bạn nghĩ rằng đọc tài liệu / thông số kỹ thuật sẽ xóa nó ra, nhưng không, bạn sẽ nhận được một lỗ sâu trong đầu vì tất cả sự cào cấu dữ dội trong khi cố gắng giải mã thông số kỹ thuật.
Cơ đốc giáo,

Tôi muốn lập luận rằng đây sẽ là một nơi tốt hơn là sao chép mã - và tôi ghét sự trùng lặp nói chung.
Cơ đốc giáo

Câu trả lời này cho thấy chính xác cách nó hoạt động. Và việc sử dụng hai ký tự không hề phức tạp! Một &với tên để đánh dấu một phần và một *tên giống để nhớ lại nó. Điều đó rất đơn giản. Bạn đánh dấu một dòng với &namevà mọi thứ được lồng bên dưới dòng đó sau đó sẽ được sử dụng lại với *name. Cám ơn bài viết này, nó khá hữu ích, bất chấp những ý kiến nói rằng nó phức tạp ...
daevski
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.