【问题标题】:Why are strings beginning with a space converted with: ! ' with Ruby/YAML为什么以空格开头的字符串转换为:! ' 与 Ruby/YAML
【发布时间】:2012-12-09 19:49:32
【问题描述】:

我正在使用 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 文档,它说单个感叹号用于表示本地数据类型。

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

【问题讨论】:

    标签: ruby yaml


    【解决方案1】:

    ! is known as the "non-specific tag"。它强制 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。单引号隐式键”提到:“所有前导和尾随空格字符都从内容中排除。”。我不确定,但我认为它可能需要使用 !防止前导空格被删除?
    • 它所指的前导和尾随空格在引号之前和之后。可以通过将! 编辑出来并重新加载yaml 来证明不需要!,它在没有! 的情况下加载完全相同
    猜你喜欢
    • 1970-01-01
    • 2020-03-30
    • 1970-01-01
    • 2020-09-14
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    • 2020-12-09
    • 1970-01-01
    相关资源
    最近更新 更多