YAML中的复杂映射键是什么?

YAML中的复杂映射键是什么?,yaml,Yaml,YAML上有一个关于问号的第2.11段: 问号和空格(“?”)表示复杂的映射键。在块集合中,键:值对可以紧跟在破折号、冒号或问号之后开始 该示例如下所示: --- ? - Detroit Tigers - Chicago cubs : - 2001-07-23 另一个示例也无法转换为XML: %YAML 1.2 - - - !!map { ? !!str "Not indented" : !!map { ? !!str "By one space" :

YAML上有一个关于问号的第2.11段:

问号和空格(“?”)表示复杂的映射键。在块集合中,键:值对可以紧跟在破折号、冒号或问号之后开始

该示例如下所示:

---
? - Detroit Tigers
  - Chicago cubs
:
  - 2001-07-23
另一个示例也无法转换为XML:

%YAML 1.2
- - -
!!map {
  ? !!str "Not indented"
  : !!map {
      ? !!str "By one space"
      : !!str "By four\n  spaces\n",
      ? !!str "Flow style"
      : !!seq [
          !!str "By two",
          !!str "Also by two",
          !!str "Still by two",
        ]
    }
}
不幸的是,我不明白这意味着什么。我尝试使用将其转换为XML,但出现了一个错误

所以我的问题是:


问号的作用是什么?

规格不是很清楚,但经过一番努力,我终于明白了。YAML有两种块映射键:隐式和显式。隐式风格是您熟悉的类型:

映射:
傅:1
巴兹:2
“qux:qux”:3
例如,如果我们在Ruby中加载此YAML,我们将得到以下结果:

{“映射”=>
{“foo”=>1,
“bar baz”=>2,
“qux:qux”=>3
}
}
但我们也可以使用显式风格来表达同样的东西:

映射:
? 福
: 1
? 巴兹酒吧
: 2
? “qux:qux”
: 3
换句话说,以
开头的行表示键,以
开头的行表示值

那有什么用?它允许我们使用任何YAML结构作为映射键。要将序列用作映射键吗?你可以!要将映射用作映射键吗?瞧:

映射:
#使用序列作为键
? - 福
-酒吧
: 1
#使用映射作为键
? baz:qux
: 2
#您可以跳过该值,这意味着'null'`
? 库克斯
#您可以将该键留空,这意味着一个'null'键
?
: 3
#您甚至可以跳过键和值,因此它们都将为空`
?
#或者可以使用一个非常长的标量作为键
? |
我们美国人民,为了形成一个更强大的国家
完善联盟,建立公正,确保国内安宁,
提供共同防御,促进普遍福利,
确保我们自己和我们的家人享有自由的祝福
子孙后代,一定要为国家制定和确立这部宪法
美利坚合众国。
: 3
#或者你只是觉得可笑
? - 福:酒吧
巴兹:
-{qux:qux}
-斯塔普
: 4
在Ruby中,这将产生以下令人愉快的哈希:

{“映射”=>
{[“foo”,“bar”]=>1,
{“baz”=>“qux”}=>2,
“quux”=>零,
零=>零,
“我们美国人民,为了组成一个更完善的联邦,建立正义,确保国内安宁,为共同防御提供保障,促进普遍福利,并确保我们自己和我们的国家享有自由的祝福,我们为美利坚合众国制定并制定本宪法。\n”=>3
[{“foo”=>“bar”,“baz”=>[{“qux”=>“qux”}],“stahp”]=>4
}
}
哦,“底特律老虎”的例子在Ruby解析时是这样的:

YAML.load
#          [ # ],
#[“纽约洋基队”、“亚特兰大勇士队”]=>
#          [ #,
#            #,
#            # ]
#     }

只是想添加一个复杂的映射,如果您的密钥是一个特殊的字符,它也会有所帮助。例如,如果您的
k:v
是:

!: "abc"
这种特殊的字符密钥是不允许的 因此,您可以这样做:

? "!"
: "abc"

回答得很好,这是对规范中一个不太为人所知的元素的一个很好的参考。