YAML中的<<(左双箭头)语法是什么,它的位置是什么?

Mar*_*ery 38 yaml

<<:YAML中的运算符可用于将一个映射的内容导入另一个映射,类似于**Python中的双splat运算符或...JavaScript中的对象解构运算符.例如,

foo:
  a: b
  <<:
    c: d
  e: f
Run Code Online (Sandbox Code Playgroud)

相当于

foo:
  a: b
  c: d
  e: f
Run Code Online (Sandbox Code Playgroud)

当与节点锚一起使用时,这在许多对象中包含一些常见的默认属性时很有用,例如,在Y分钟中学习YAML教程:

# 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
Run Code Online (Sandbox Code Playgroud)

但是,我对这种语法的来源或工作原理感到困惑.CTRL+ F荷兰国际集团的YAML规范<<显示,它不规范的任何地方出现.然而,它至少得到了PyYAMLhttp://yaml-online-parser.appspot.com/的支持.

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

Ant*_*hon 32

它被称为YAML 1.1版的Merge Key Language-Independent Type.并在这里推测

它是解析器可以选择支持的东西,它本质上是对特殊键的键值对的解释<<,其中值是映射(通常通过规范中的别名指示,虽然看起来不像根据需要,不使用别名或映射列表(即映射的别名)没有多大意义,并以特殊方式进行解释.

  • 请注意,当前的[合并类型规范](https://yaml.org/type/merge.html) 的副标题仍然是 *Working Draft 2005-01-18*,甚至在当前的 [YAML 1.2 中也没有提及。 2 规范](https://yaml.org/spec/1.2.2/)。 (3认同)
  • 谢谢,在此之后寻找了很长一段时间。我想称之为解构太容易了 (2认同)

xdh*_*ore 18

要添加到其他答案:

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

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

foo: &foo
    <<: *base

bar: &bar
    <<: *base
    age: 20
Run Code Online (Sandbox Code Playgroud)

对于底部的两项产量:

foo: 
    name: Everyone has same name
    age: 5

bar:
    name: Everyone has same name
    age: 20
Run Code Online (Sandbox Code Playgroud)

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

  • @Reflection:来自[合并键规范](https://yaml.org/type/merge.html):“序列中较早的映射节点中的键覆盖后面的映射节点中指定的键。”。因此,如果对象 C 合并 A 和 B(按该顺序),则 C 将获得 A 的 X。 (2认同)