YAML 中的 <<(双左箭头)语法是啥,它在哪里指定?

Posted

技术标签:

【中文标题】YAML 中的 <<(双左箭头)语法是啥,它在哪里指定?【英文标题】:What is the << (double left arrow) syntax in YAML called, and where's it specced?YAML 中的 <<(双左箭头)语法是什么,它在哪里指定? 【发布时间】:2017-04-25 02:32:29 【问题描述】:

YAML 中的 &lt;&lt;: 运算符可用于将一个映射的内容导入另一个映射,类似于 Python 中的 ** double-splat 运算符或 javascript 中的 ... 对象解构运算符。例如,

foo:
  a: b
  <<:
    c: d
  e: f

等价于

foo:
  a: b
  c: d
  e: f

这在与node anchors 一起使用时很有用,可以在许多对象中包含一些常见的默认属性,例如Learn YAML in Y minutes 教程中的说明:

# Anchors can be used to duplicate/inherit properties
base: &base
    name: Everyone has same name

foo: &foo
    <<: *base
    age: 10

bar: &bar
    <<: *base
    age: 20

但是,我对这种语法的来源或它的工作原理感到困惑。 CTRL+F 为YAML spec 输入&lt;&lt; 表明它没有出现在规范中的任何位置。但它至少得到了PyYAML 和http://yaml-online-parser.appspot.com/ 的支持。

这是什么语法,为什么它似乎没有出现在规范中?

【问题讨论】:

它不是 &lt;&lt;: 运算符,它是键值对中的特定键 &lt;&lt;: 是普通的键值分隔符。 【参考方案1】:

补充其他答案:

IMO,“在 Y 分钟内学习 yaml”中的示例不完整,因为它没有显示密钥相同时会发生什么。例如:

base: &base
    name: Everyone has same name
    age: 5

foo: &foo
    <<: *base

bar: &bar
    <<: *base
    age: 20

对于底部的两个项目产生:

foo: 
    name: Everyone has same name
    age: 5

bar:
    name: Everyone has same name
    age: 20

bar 会覆盖年龄,而foo 不会。根据the spec,合并对象的条目的优先级低于接收它们的对象的条目。

【讨论】:

【参考方案2】:

在 YAML 1.1 版中称为 Merge Key Language-Independent Type。并指定here

这是解析器可以选择支持的东西,它本质上是具有特殊键 &lt;&lt; 的键值对的解释,其中值是映射(通常通过规范中的别名表示,并且尽管这似乎不是必需的,但不使用别名)或映射列表(即映射的别名)并以特殊方式解释是没有意义的。

【讨论】:

谢谢,在此之后一直在寻找。我想把它称为解构太容易了

以上是关于YAML 中的 <<(双左箭头)语法是啥,它在哪里指定?的主要内容,如果未能解决你的问题,请参考以下文章

需要双左连接的所有结果

dockerfile中的双箭头(<<:*django)是啥意思?

SpringBoot:yaml配置注入和JSR303数据校验

我可以使用箭头功能而不是React Hooks的普通功能吗?

rust中的“箭头函数” -;和=;的区别

node.js 的 config.yaml 中 Heroku 环境变量的语法?