arrays - 是否有用于共享列表或 map 的一部分的 YAML 语法?

标签 arrays dictionary yaml cross-reference

所以,我知道我可以做这样的事情:

sitelist: &sites
  - www.foo.com
  - www.bar.com

anotherlist: *sites

并有 sitelistanotherlist都包含 www.foo.comwww.bar.com .然而,我真正想要的是anotherlist还包含 www.baz.com , 而不必重复 www.foo.comwww.baz.com .

这样做会在 YAML 解析器中给我一个语法错误:
sitelist: &sites
  - www.foo.com
  - www.bar.com

anotherlist: *sites
  - www.baz.com

仅使用 anchor 和别名似乎不可能在不添加另一级子结构的情况下做我想做的事,例如:
sitelist: &sites
  - www.foo.com
  - www.bar.com

anotherlist:
  - *sites
  - www.baz.com

这意味着此 YAML 文件的使用者必须意识到这一点。

有没有纯粹的 YAML 方式来做这样的事情?或者我是否必须使用一些后 YAML 处理,例如实现变量替换或自动提升某些类型的子结构?我已经在做这种后处理来处理其他几个用例,所以我并不完全反对它。但是我的 YAML 文件将由人工编写,而不是机器生成,因此我希望在标准 YAML 语法基础上尽量减少用户需要记住的规则数量。

我也希望能够用 map 做类似的事情:
namedsites: &sites
  Foo: www.foo.com
  Bar: www.bar.com

moresites: *sites
  Baz: www.baz.com

我已经搜索过 YAML spec ,并且找不到任何东西,所以我怀疑答案只是“不,你不能这样做”。但如果有人有任何想法,那就太好了。

编辑:由于没有答案,我假设没有人发现我在 YAML 规范中没有发现的任何内容,并且这不能在 YAML 层完成。所以我提出了这个问题,以便对 YAML 进行后处理以帮助解决这个问题,以防将来有人发现这个问题。

最佳答案

The merge key type可能是你想要的。它使用特殊的 <<映射键指示合并,允许映射的别名(或此类别名的序列)用作初始值设定项以合并为单个映射。此外,您仍然可以显式覆盖值,或添加更多不存在于合并列表中的值。

重要的是要注意它适用于映射,而不是作为第一个示例的序列。当您考虑它时,这是有道理的,并且您的示例看起来可能无论如何都不需要是连续的。只需将序列值更改为映射键就可以解决问题,如下面(未经测试的)示例所示:

sitelist: &sites
  ? www.foo.com  # "www.foo.com" is the key, the value is null
  ? www.bar.com

anotherlist:
  << : *sites    # merge *sites into this mapping
  ? www.baz.com  # add extra stuff

需要注意的一些事情。首先,由于<<是一个键,每个节点只能指定一次。其次,当使用序列作为值时,顺序很重要。这在此处的示例中无关紧要,因为没有关联的值,但值得注意。

关于arrays - 是否有用于共享列表或 map 的一部分的 YAML 语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9254178/

相关文章:

kubernetes - 从 kubernetes yaml 定义中的文件创建配置映射时 |+ 和 |- 之间有什么区别?

javascript - 从字符串中提取数字并将它们存储在 array-Javascript 中

javascript - 带有局部参数的 onclick 全局函数

Swift - 将文本添加到字典

具有相同键的 Python 字典排序

json - 在 cloudformation 中的 yaml 内的 json 中使用 Fn::ImportValue

arrays - 如何使用 sorted 对元组数组进行排序? (无法使用类型参数列表调用 'sorted')

javascript - 在 Vue JS 中访问存储值

dictionary - Clojure换能器渴望吗?

bash - 无法在 GitLab CI YAML 中打印包含双引号的字符串