【问题标题】:Why does Ruby YAML sometimes add '2' after pipe char (|)?为什么 Ruby YAML 有时会在管道字符 (|) 之后添加“2”?
【发布时间】:2018-07-02 15:58:50
【问题描述】:

在使用 Ruby 模块 YAML 时,我遇到了一个我不理解的行为。

多行字符串的String#to_yaml 有时会在管道字符之后添加字符“2”:“|2”与仅“|”。

特别是,当第一行为空时,它会这样做。

有什么线索吗?

这是一个例子:

C:\Users\Burdette>irb
irb(main):001:0> RUBY_VERSION
=> "2.2.6"
irb(main):002:0> require 'yaml'
=> true
irb(main):003:0> s = <<EOT
irb(main):004:0" 1
irb(main):005:0" 2
irb(main):006:0" 3
irb(main):007:0" EOT
=> "1\n2\n3\n"
irb(main):008:0> puts s.to_yaml
--- |
  1
  2
  3
=> nil
irb(main):009:0> s = "\n" + s
=> "\n1\n2\n3\n"
irb(main):010:0> puts s.to_yaml
--- |2

  1
  2
  3
=> nil
irb(main):011:0> exit

【问题讨论】:

  • 那个2是一个缩进指示符,它表示块缩进2个空格。
  • 我没有缩进。空行是否相当于缩进请求?此外,如果我将每行缩进 4 个空格,则可以使用该间距,并且无论有无前导空行,我仍然会得到“|2”。

标签: ruby yaml


【解决方案1】:

| 表示文字标量。后面跟着一个Block Scalar Header,它可以指示文字的缩进级别以及它是否被“chomped”。 Chomping 是是否剥离最后的换行符。例如,当我们删除最后一个换行符时...

2.4.3 :059 > puts "\n1\n2\n3".to_yaml
--- |2-

  1
  2
  3
 => nil 

...YAML 添加一个- 表示删除了最后的换行符。

同样,2 表示删除每行的前两个空格。这允许保留原始字符串中的前导换行符。

2.4.3 :061 > puts "\n  1\n2\n3".to_yaml
--- |2-

    1
  2
  3
 => nil 

通常缩进级别是空白的,所以你只看到|,缩进值是从第一行非空行推断出来的。在本例中,推断为 2。

2.4.3 :062 > puts "1\n2\n3".to_yaml
--- |-
  1
  2
  3
 => nil 

但是当第一行包含歧义时,必须明确说明。这是规范中的完整文档。

8.1.1.1. Block Indentation Indicator

通常,块标量的缩进级别从其第一个非空行检测。任何前导空行包含的空格多于第一个非空行是错误的。

当第一个非空行包含前导内容空格字符时,检测失败。内容可以安全地以制表符或“#”字符开头。

当检测失败时,YAML 要求使用显式缩进指示符指定内容的缩进级别。此级别指定为用于内容的附加缩进空间的整数,相对于其父节点。

为块标量节点指定缩进指示符总是有效的,尽管 YAML 处理器应该只在检测失败的情况下发出显式缩进指示符。

在您的情况下,无论是否使用显式指示符,YAML 往返都很好。它可以从第一个非空行获取缩进。我想特定的 YAML 实现是保守的,并且在第一行为空白时使缩进显式。

在 YAML 中有多种表达相同内容的方法。例如,添加一个额外的前导空格并将 Ruby 切换到引号。

2.4.3 :055 > puts " \n1\n2\n3\n".to_yaml
--- " \n1\n2\n3\n"
 => nil 

为什么不这样?

--- |2-
   
  1
  2
  3

可能是因为它不容易阅读,而且在为人类做好准备时很容易错过额外的空间,YAML 既适用于人类,也适用于机器。要真正了解,您必须阅读 YAML 库的代码,并可能在其开发过程中进行在线讨论。我猜想当有任何歧义或混淆的可能性时,决定明确是更安全的。

【讨论】:

  • 非常感谢,施韦恩!我查看了这个文档,但不知道要搜索什么术语。我看了每一个'|'字符,试图找到一个后面跟着一个数字的字符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-17
  • 1970-01-01
  • 2013-03-10
  • 2020-04-30
  • 2017-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多