为什么以空格开头的字符串在Ruby/YAML中被转换为'! '?

7
我正在使用YAML将Ruby哈希写入文件。
File.open(output_file, "w") {|file| file.puts YAML::dump(final)}

散列包含字符串作为键和浮点数作为值。
当我的字符串只包含字母时,它们会如此输出到文件中:
abc: 1.0
bcd: 1.0
cde: 1.0

当一个字符串以空格开头时,它将按原样输出:
! ' ab': 1.0

我重新读取文件后一切正常,但我想知道为什么会发生这种情况以及它的含义。

我查阅了YAML文档,其中提到单个感叹号用于表示本地数据类型。

为什么在以空格开头的字符串上会出现这种情况?

1个回答

5
!被称为“非特定标记”。它强制YAML引擎将以下项解码为字符串、哈希或数组。它基本上禁用了将其解释为不同类型的功能。我不确定为什么引擎会这样标记它们;似乎并不需要。也许它只是过度热衷于消除歧义?无论如何,这都是不必要的语法。
YAML.dump({' a'=>0})
=> "---\n! ' a': 0\n"
YAML.load("---\n! ' a': 0\n") # with the bang
=> {" a"=>0}
YAML.load("---\n' a': 0\n")   # without the bang
=> {" a"=>0}

我认为它需要将字符串放在引号中,以确认空格是字符串的一部分。我还进一步检查了规范,在“示例7.8。单引号隐式键”一节中发现提到:“所有前导和尾随的空白字符都不包括在内容中。” 我不确定,但我认为可能需要使用!来防止前导空格被删除? - Gilles
1
它所指的前导和尾随空格是在引号之前和之后。可以通过将其删除并重新加载yaml来证明!是不必要的,这样加载的内容与没有!时完全相同。 - marcus erronius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接