YAML中单个'n'字符的特殊意义?

时间:2017-05-27 01:02:06

标签: yaml sublimetext3

单个n字符在YAML中是否具有任何特殊意义?我问,因为我的Sublime 3文本编辑器使用与其他字符串值不同的颜色突出显示它,我真的不明白它的原因。

enter image description here

1 个答案:

答案 0 :(得分:1)

TL; DR; n是YAML中2009年之前的规范表示,用于布尔值“False”。

Sublime不应该突出显示默认情况下,因为n自2009年以来在YAML中没有这样的表示。如果你明确指定编辑一个,它应该只突出显示n YAML 1.1文件通过界面,或者文档通过文档顶部的指令%YAML 1.1识别出来。

在YAML中,标量可以有不同的格式(from the YAML 1.2 specification):

  

YAML允许以多种格式呈现标量。例如,整数“11”也可以写为“0xB”。标签必须指定一种机制,用于将格式化内容转换为规范形式,以便在相等性测试中使用。与节点样式一样,格式是表示细节,不会反映在序列化树和表示图中。

旧的1.1规范在该段中有不同的第二句,即directly mentions booleans

  

例如,布尔“true”也可能写为“是”。

如何在编程语言中构造YAML标量取决于解析器使用的模式。最基本的模式将每个标量构造为一个字符串(即没有解释)。

在更实际的模式中,有规范形式(通常用于表示计算机编程类型,如整数,布尔值,日期时间戳等)和匹配标量(通常通过正则表达式),允许构造就像这样的一种。 E.g 42是规范表示,但在输入端0x2a0o52也允许使用相同的整数值。

在YAML 1.2中,当truefalsetrue匹配TrueTRUE时,将core schemas的布尔值清理为规范形式falseFalseFALSEtruefalse - 只允许yn的简单JSON架构的扩展。

广泛更改from YAML 1.1,其中规范表示为yY,同时匹配所有yesYesYES,{ {1}},nNnoNoNOtrueTrue,{{1 }},TRUEfalseFalseFALSEonOnONoffOffOFF。这通常会导致混淆,因为程序中的匹配字符串必须在YAML中用显式引号表示,以便在加载时不被解释为布尔值。

Sublime似乎支持YAML 1.1规范,其中布尔值可以写为n。由于YAML 1.2规范来自2009年,我真的不认为Sublime这样做是正确的,并且不应该将n解释为布尔值,除非YAML文档以明确的指令%YAML 1.1开头。 (由于你在界面中没有给出任何指示,因为它不在文档中,我认为你没有。)

当然Sublime的原始版本先于YAML 1.2规范,但您希望在8年后他们会通过更新来纠正这个问题。另一个这样的变化是以0开头的标量,如0123,它们是YAML 1.2中的字符串,但是在YAML 1.1中是一个(八进制)整数。也许您使用它作为测试来查看YAML模式是否已正确更新:除非您明确指定YAML 1.1,否则不应在编辑器中突出显示0123

当然有过时的库只支持YAML 1.1,你甚至可能会使用它,但这不是编辑器中默认的借口。