Can I assign a YAML anchor without assigning it to a key?

Hen*_*k N 5 yaml

I want to effectively define a variable in YAML, then use it as a value in multiple places:

myvar_foo: &myvar_bar 1000
my_values:
  one: *myvar_bar
  two: *myvar_bar
Run Code Online (Sandbox Code Playgroud)

It feels inelegant to me that I need to have myvar_foo in there. I never use it; I only use myvar_bar.

有什么办法可以实现这一点吗?我能想到的最好的方法是使用一个明显一次性的名称,例如

_: &myvar_bar 1000
my_values:
  one: *myvar_bar
  two: *myvar_bar
Run Code Online (Sandbox Code Playgroud)

或者在我第一次使用它时分配锚点

my_values:
  one: &myvar_bar 1000
  two: *myvar_bar
Run Code Online (Sandbox Code Playgroud)

fly*_*lyx 3

YAML 中没有变量。您无需在 YAML 中分配任何内容。您正在尝试将编程语言范例应用于数据序列化语言。

YAML 文档内容的语义是一个弱连接图。任何值都是该图中的一个节点。锚点只是节点的名称,以便以后可以引用。这意味着:

  • 你的值(1000)是一个节点,因为所有内容都存储在节点中。
  • 由于图是弱连接的,因此必须有一条从根节点到您的值的路径。
  • 因此,您不能将原始值放置在文档内容之外。

您提到的第二个选项:

my_values:
  one: &myvar_bar 1000
  two: *myvar_bar
Run Code Online (Sandbox Code Playgroud)

是在 YAML 中执行此操作的自然方法:第一次出现时,节点的值被定义并使用锚点命名。随后的每个事件都将被序列化为该锚定节点的别名。

当然,YAML 并不是为您想要使用它执行的操作而设计的这一事实并不会使您的目标无效。如果您想将值定义保留在内容树之外并控制加载此 YAML 的代码,您可以这样做:

declare:
- &myvalue_bar 1000
begin:
  my_values:
    one: *myvar_bar
    two: *myvar_bar
Run Code Online (Sandbox Code Playgroud)

然后,在加载时,将文档树中的值root["begin"]作为加载的值。您甚至可以通过使用像这样的标题来自动执行此操作

%YAML 1.2
--- !vars
declare:
- &myvar_bar 1000
begin:
  # snip
Run Code Online (Sandbox Code Playgroud)

然后,您只需要注册一个构造函数即可!vars返回 的内部值begin