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 中的 <<:
运算符可用于将一个映射的内容导入另一个映射,类似于 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 输入<<
表明它没有出现在规范中的任何位置。但它至少得到了PyYAML 和http://yaml-online-parser.appspot.com/ 的支持。
这是什么语法,为什么它似乎没有出现在规范中?
【问题讨论】:
它不是<<:
运算符,它是键值对中的特定键 <<
。 :
是普通的键值分隔符。
【参考方案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
这是解析器可以选择支持的东西,它本质上是具有特殊键 <<
的键值对的解释,其中值是映射(通常通过规范中的别名表示,并且尽管这似乎不是必需的,但不使用别名)或映射列表(即映射的别名)并以特殊方式解释是没有意义的。
【讨论】:
谢谢,在此之后一直在寻找。我想把它称为解构太容易了以上是关于YAML 中的 <<(双左箭头)语法是啥,它在哪里指定?的主要内容,如果未能解决你的问题,请参考以下文章
dockerfile中的双箭头(<<:*django)是啥意思?
SpringBoot:yaml配置注入和JSR303数据校验