【问题标题】:YAML indentation for array in hash哈希中数组的 YAML 缩进
【发布时间】:2021-12-31 01:58:55
【问题描述】:

我认为缩进在 YAML 中很重要。

我在irb中测试了以下内容:

> puts({1=>[1,2,3]}.to_yaml)
--- 
1: 
- 1
- 2
- 3
 => nil 

我希望是这样的:

> puts({1=>[1,2,3]}.to_yaml)
--- 
1: 
  - 1
  - 2
  - 3
 => nil 

为什么数组没有缩进?

我在http://www.yaml.org/YAML_for_ruby.html#collections 找到了这个。

序列中的破折号算作缩进,因此您可以添加一个 映射内部的序列,不需要空格作为缩进。

【问题讨论】:

  • 显然在将标量映射到序列时不需要缩进。
  • 两者都有效。我同意你的看法,他们不应该这样。即使是官方 YAML 网站也有这两者...yaml.org

标签: ruby yaml


【解决方案1】:

据我所知,这两种方法都有效:

require 'yaml'

YAML.load(%q{--- 
1:
- 1
- 2
- 3
})
# => {1=>[1, 2, 3]}

YAML.load(%q{--- 
1:
  - 1
  - 2
  - 3
})
# => {1=>[1, 2, 3]}

不清楚为什么您认为连字符前应该有空格。如果您认为这违反了spec,请说明原因。

为什么数组没有缩进?

连字符前不需要缩进,不加更简单。

【讨论】:

  • 虽然不需要空格,但我觉得它更具可读性
  • 恰恰相反,当你有像 kubernetes 规范这样的对象时,缩进越多 - 由于额外的空格\滚动\包装,它的可读性越差
【解决方案2】:

这样你就可以做到:

1: 
- 2: 3
  4: 5
- 6: 7
  8: 9
- 10
=> {1 => [{2 => 3, 4 => 5}, {6 => 7, 8 => 9}, 10]}

基本上,破折号分隔对象,缩进表示键值对的“值”。

这是我能做的最好的;我还没有设法找到语法的这个或那个方面背后的任何原因。

【讨论】:

  • hm 但无论如何你都可以这样做......等效(将所有行缩进顶部 2 个空格)是相同的结果
  • 不幸的是,这与 Perl 5.18(我绑定的版本)内置的 YAML 解析器不兼容。没有缩进,我得到“YAML 错误:地图中的无效元素”。我不确定新版本的 Perl 是否已经适应了这种明显合法的语法。
  • 更正:如果我'使用 YAML::Syck;'在 Perl 中,我能够阅读 Ruby 的默认 YAML 风格。标准最好的一点是有很多可供选择:)。
猜你喜欢
  • 1970-01-01
  • 2013-11-28
  • 1970-01-01
  • 2014-04-30
  • 2020-07-24
  • 2011-03-10
  • 2017-10-02
  • 2020-07-19
相关资源
最近更新 更多