【问题标题】:Why isn't two-spaced YAML parsed like four-spaced YAML?为什么两行 YAML 不像四行 YAML 那样解析?
【发布时间】:2018-05-30 00:26:27
【问题描述】:

在解析使用两个空格缩进创建的 YAML(使用 Ruby 2.5/Psych)时,我看到了奇怪的行为。同一个文件,每行缩进四个空格 - 在我看来 - 正如预期的那样。

两个空格:

windows:
  - shell:
    panes:
      - echo hello

产生以下哈希:

{"windows"=>[{"shell"=>nil, "panes"=>["echo hello"]}]}

而使用四个空格缩进:

windows:
    - shell:
        panes:
            - echo hello

结果:

{"windows"=>[{"shell"=>{"panes"=>["echo hello"]}}]}

我只是浏览了the spec 并没有看到与此问题相关的任何内容。

这是预期的行为吗?如果是这样,我将非常感谢解释原因的资源链接。

【问题讨论】:

    标签: yaml ruby-2.5


    【解决方案1】:

    虽然韦恩的解决方案是正确的,但解释似乎有点不对劲,所以我会抛出我的:

    在 YAML 中,块序列项的 -(如块映射的 ?:)被视为缩进spec):

    “-”、“?”用于表示块集合条目的“:”字符被人们认为是缩进的一部分。这由相关制作根据具体情况进行处理。

    此外,所有块集合(序列和映射)都从它们的第一项开始缩进(因为没有明确的起始指示符)。所以在- shell:这一行中,-定义了新开始的序列的缩进级别,同时shell:定义了新开始的映射的缩进级别,也就是序列项的内容。请注意- 是如何被视为缩进来定义映射的缩进级别的。

    现在,重新审视您的第一个示例:

    windows:
      - shell:
        panes:
          - echo hello
    

    panes:shell: 处于同一级别。这意味着 YAML 将其解析为由 shell: 开始的映射的 key,这意味着键 shell 具有空值。隐式键的映射值,如果不在同一行,则必须始终比对应的映射键缩进更多(spec):

    块节点的属性可能跨越多行。在这种情况下,它们必须比块集合缩进至少一个空格,而不管块集合条目的缩进。

    OTOH,在第二个例子中:

    windows:
        - shell:
            panes:
                - echo hello
    

    panes:shell: 相比处于更深的缩进级别。这意味着它被解析为键shell,从而开始一个新的嵌套块映射。

    最后,请注意,由于- 被视为缩进的一部分,“缩进两个空格” 也可能意味着:

    windows:
    - shell:
        panes:
        - echo hello
    

    请注意- 的缩进程度不高于其映射键。这是因为spec 说:

    由于人们认为“-”指示符是缩进,嵌套的块序列可能会缩进一个更少的空间来补偿,当然,如果嵌套在另一个块序列中(块输出上下文与块输入上下文) .

    【讨论】:

    • 这很有帮助。感谢您花时间整理这个答案。
    【解决方案2】:

    问题是您不能简单地将每两个空格替换为四个空格。那是因为在这对行中:

      - shell:
        panes:
    

    第二行这两个空格:

        panes:
      ^^
    

    是上面一行中“-”的缩写。如果第二行没有缩写,那么这对行将是:

      - shell:
      - panes:
    

    因此,当缩进加倍时,这些行的第二个应该只将其第一对空格加倍,而不是第二个。这将为该对产生正确的缩进:

        - shell:
          panes:
    

    所以,如果你只扩展“panes:”行中的第一对空格,你会得到:

    windows:
        - shell:
          panes:
              - git status
    

    正确解析为预期结果。

    【讨论】:

      猜你喜欢
      • 2012-02-04
      • 1970-01-01
      • 2012-10-30
      • 1970-01-01
      • 1970-01-01
      • 2021-06-06
      • 2018-01-07
      • 2015-12-06
      • 1970-01-01
      相关资源
      最近更新 更多