Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Ruby YAML有时会添加';2';在管道字符(|)之后?_Ruby_Yaml - Fatal编程技术网

为什么Ruby YAML有时会添加';2';在管道字符(|)之后?

为什么Ruby YAML有时会添加';2';在管道字符(|)之后?,ruby,yaml,Ruby,Yaml,在使用Ruby模块YAML时,我遇到了一个我不理解的行为 多行字符串的字符串#to"yaml有时会在管道字符后面添加字符“2”:“2”vs.just“|” 特别是,它在第一行为空时执行此操作 有什么线索说明原因吗 下面是一个例子: C:\Users\Burdette>irb irb(main):001:0> RUBY_VERSION => "2.2.6" irb(main):002:0> require 'yaml' => true irb(main):003:0&

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

多行字符串的字符串#to"yaml有时会在管道字符后面添加字符“2”:“2”vs.just“|”

特别是,它在第一行为空时执行此操作

有什么线索说明原因吗

下面是一个例子:

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
C:\Users\Burdette>irb
irb(主):001:0>RUBY_版本
=> "2.2.6"
irb(主):002:0>要求“yaml”
=>正确
irb(主):003:0>s=将s放置到\u yaml
--- |
1.
2.
3.
=>零
irb(主):009:0>s=“\n”+s
=>“\n1\n2\n3\n”
irb(主):010:0>将s.置于
--- |2
1.
2.
3.
=>零
irb(主):011:0>退出

|
表示文字标量。后面是一个可以指示文字缩进级别以及是否为“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 
但是,当第一行包含歧义时,必须将其显式化。这是这方面规范的完整文档

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

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

当检测失败时,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库,您必须阅读YAML库的代码,可能还需要在开发过程中进行在线讨论。我猜,当存在歧义或混淆的可能性时,它被确定为显式的更安全。

|
表示一个文字标量。后面是一个可以指示文字缩进级别以及是否为“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 
但是,当第一行包含歧义时,必须将其显式化。这是这方面规范的完整文档

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

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

当检测失败时,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库,您必须阅读YAML库的代码,可能还需要在开发过程中进行在线讨论。我猜,当有任何歧义或混淆的可能性时,它被认为是明确的更安全。

2
是一个缩进指示器,它说块缩进了2个空格。我没有缩进。空行是否等于缩进请求?另外,如果我将每行缩进4个空格,那么这个空格就被接受了,并且我仍然得到了“| 2”,包括有前导空行、有前导空行和没有前导空行