问题 为什么YAML规范在结肠后要求空间?


YAML规格 明确指出:

映射使用冒号和空格(“:”)来标记每个键:值对。

所以这是合法的:

foo: bar

但是,这不是:

foo:bar

我看到网上很多人都在争论这个空间。我认为他们有一点意见。我自己被它烧了几次。

为什么空间是强制性的?它背后的设计考虑是什么?


10857
2018-02-08 21:44


起源



答案:


它很容易被遗漏,因为该规范使用了仅突出显示内部链接的最后一个字符的奇怪惯例,但是 “: ” 在你引用的部分实际上是一个链接 到规范的另一部分 它回答了你的问题:

通常,YAML坚持将“:”映射值指示符与空格分隔。这种限制的好处是“:”字符可以在普通标量中使用,只要它后面没有空格。这允许不带引号的URL和时间戳。它也是混淆的潜在来源,因为“a:1”是一个普通的标量而不是一个关键:值对。

因此,动机是您可以编写此类列表而无需任何引用:

useful_values:
- 2:30
- http://example.com
- localhost:8080

如果空格是可选的,则最终可能会模糊不清,并被解释为一组键值对。

在旁边: 这是JS的一小部分,使得该文档上的链接格式化变得毫无用处。

document.styleSheets[0].insertRule('a[href^="#"] { color: #00A !important; text-decoration: underline !important; background: none !important; }', 0);

12
2018-02-08 21:55



哇!他们非常偷偷摸摸。谢谢。 - Vitaliy
我想知道为什么 yamllint.com 违反规范并说“key:value”是有效的yaml语法。 - Sibi John


答案:


它很容易被遗漏,因为该规范使用了仅突出显示内部链接的最后一个字符的奇怪惯例,但是 “: ” 在你引用的部分实际上是一个链接 到规范的另一部分 它回答了你的问题:

通常,YAML坚持将“:”映射值指示符与空格分隔。这种限制的好处是“:”字符可以在普通标量中使用,只要它后面没有空格。这允许不带引号的URL和时间戳。它也是混淆的潜在来源,因为“a:1”是一个普通的标量而不是一个关键:值对。

因此,动机是您可以编写此类列表而无需任何引用:

useful_values:
- 2:30
- http://example.com
- localhost:8080

如果空格是可选的,则最终可能会模糊不清,并被解释为一组键值对。

在旁边: 这是JS的一小部分,使得该文档上的链接格式化变得毫无用处。

document.styleSheets[0].insertRule('a[href^="#"] { color: #00A !important; text-decoration: underline !important; background: none !important; }', 0);

12
2018-02-08 21:55



哇!他们非常偷偷摸摸。谢谢。 - Vitaliy
我想知道为什么 yamllint.com 违反规范并说“key:value”是有效的yaml语法。 - Sibi John