简短的回答是两种皆可,因为它们对于YAML解析器来说都是明确无歧义的。其他回答已经指出了这个事实,但请允许我在讨论中添加一些助推剂。
YAML使用缩进不仅仅是为了美观或易读性,当组合不同的数据结构并嵌套它们时,缩进具有关键意义:
---
one:
two:
three:
---
one:
two:
three:
正如我们所看到的,只需在three
之前添加一个缩进级别,就会改变其嵌套级别并删除我们为two
分配的以前的null
值。
然而,当涉及到列表时,这种行为却不一致,因为它们可以“容忍”我们自然预期会发生的缩进级别降低(如OP所预期),以反映项目的正确嵌套级别。但它仍将以相同的方式工作:
---
one:
two:
- foo
- bar
---
one:
two:
- foo
- bar
以上的第二种形式有些出人意料,打破了缩进级别与嵌套级别相连的想法。明显地,two
(一个对象)和嵌套列表都是使用相同的缩进编写的,但却处于不同的嵌套级别。
更糟糕的是,它并不总是有效,而是仅在列表直接放置在对象键下方时才有效。将列表嵌套在其他列表中不会允许自由降低缩进级别,因为这显然会将嵌套元素带到父列表中:
---
one:
two:
-
-
-
-
---
one:
two:
-
-
-
-
我知道,我知道...别开始说上面的例子有点极端,可能会被认为是边缘情况。它们是完全有效的数据结构,证明了我的观点。当混合对象和嵌套的对象列表时,尤其是它们只有一个键时,更复杂的情况也会发生。这不仅可能导致数据结构声明中的错误,而且变得极难阅读。
以下 YAML 文档是相同的:
---
one:
two:
- three: foo
- bar
- four:
- baz
five:
- fizz
- buzz
six:
seven:
---
one:
two:
- three: foo
- bar
- four:
- baz
five:
- fizz
- buzz
six:
seven:
我不知道你怎么想,但我认为第二种方式更容易阅读和理解,尤其是在阅读非常大的文档时。第一种方式很容易迷失方向,特别是当对象声明的开头不可见时。缩进级别和嵌套级别之间没有明确的联系。
保持缩进级别与嵌套级别一致 非常重要,可以提高可读性。允许列表中有时省略缩进级别是一件需要非常小心的事情。(翻译:可选的)