我可以在不将YAML锚分配给键的情况下分配YAML锚吗?

我可以在不将YAML锚分配给键的情况下分配YAML锚吗?,yaml,Yaml,我想在YAML中有效地定义一个变量,然后在多个位置将其用作值: myvar_foo: &myvar_bar 1000 my_values: one: *myvar_bar two: *myvar_bar 我觉得我需要有myvar\u foo在那里,这让我觉得不雅观。我从不使用它;我只使用myvar\u条 有没有办法做到这一点?我能想到的最好的办法就是使用一个明显是一次性的名字,比如 _: &myvar_bar 1000 my_values: one: *myvar_

我想在YAML中有效地定义一个变量,然后在多个位置将其用作值:

myvar_foo: &myvar_bar 1000
my_values:
  one: *myvar_bar
  two: *myvar_bar
我觉得我需要有
myvar\u foo
在那里,这让我觉得不雅观。我从不使用它;我只使用
myvar\u条

有没有办法做到这一点?我能想到的最好的办法就是使用一个明显是一次性的名字,比如

_: &myvar_bar 1000
my_values:
  one: *myvar_bar
  two: *myvar_bar
或者在我第一次使用它时分配锚

my_values:
  one: &myvar_bar 1000
  two: *myvar_bar

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

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

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

my_值:
一个:&myvar_bar 1000
两个:*myvar_bar
是在YAML中执行此操作的自然方式:在第一次出现时,使用锚点定义和命名节点的值。随后,每个后续事件都将序列化为该锚定节点的别名

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

声明:
-&myvalue\u bar 1000
开始:
我的价值观:
一个:*myvar_酒吧
两个:*myvar_bar
然后,在加载时,将
根[“begin”]
中的文档树作为加载的值。您甚至可以通过使用类似

%YAML 1.2
--- !瓦尔斯
宣布:
-&myvar_bar 1000
开始:
#剪断

然后,您只需要注册
的构造函数!返回
begin
的内部值的变量

谢谢大家!!出色、彻底、务实的回答。我花了一段时间才得到最后一个例子,所以我将在这里分享我的发现,以供将来参考。经过一些研究,我相信“!vars”是一个所谓的“标记”,它有效地引入了一种新的“vars”数据类型,我使用的JSON解析器可能会配置为以某种特殊方式处理该数据类型,例如只返回“begin”的内部值。我假设“--!vars(而“%YAML 1.2”只是一个说明YAML版本的“指令”)无法编辑以修复意外提交的半编辑。我刚才说:我假设“--!vars“将文档作为一个整体进行标记。
%YAML 1.2
通常是多余的,但我喜欢在显式地给出
--
时使用它,并且我喜欢在设置根节点的标记时给出
--
。从语法上讲,您可以在
declare
上方自己的一行中使用
!vars
。是的,
!var
是一个标记,sp具体地说,由单个
表示的本地标记(与字符串的全局标记(如
!!str
)相比)。关于如何在首选YAML实现中处理它们,这里有很多示例;遗憾的是,这里经常缺少库文档。