YAML – 缩进与分隔
YAML - 缩进和字符串表示
Section titled “YAML - 缩进和字符串表示”缩进(Indentation)是 YAML 结构的基础,用于定义元素之间的嵌套和关系。此外,YAML 提供了灵活的方式来表示字符串。本章将涵盖这些关键方面。
YAML 缩进
Section titled “YAML 缩进”YAML 使用空格进行缩进。严格禁止使用制表符(Tabs),因为它们在不同系统上宽度不同,可能导致歧义。缩进使用的空格数量没有固定要求,但关键在于给定块内必须保持一致性。
- **定义结构:**缩进表示嵌套。一个缩进的块属于其前面缩进较少的条目。
- **块集合(Block Collections):**块序列(列表/list)中的条目,其开头的短划线(
-)必须共享相同的缩进级别。块映射(block mapping)中的键值对(key-value pairs)也必须对齐。 - **流集合(Flow Collections):**流集合(flow collections)(映射使用
{},序列使用[])对其内部元素不区分缩进(indentation-sensitive),但相对于其包含块必须进行适当的缩进。
常见的做法是每级缩进使用 2 或 4 个空格。
以下发票示例展示了如何使用复杂的缩进结构来定义数据:
invoice: 34843date: 2001-01-23bill-to: &id001 given: Chris family: Dumars address: lines: | 458 Walkman Dr. Suite #292 city: Royal Oak state: MI postal: 48046ship-to: *id001 # 使用别名product: - sku: BL394D quantity: 4 description: Basketball price: 450.00 - sku: BL4438H quantity: 1 description: Super Hoop price: 2392.00tax: 251.42total: 4443.52comments: > Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338.不正确的缩进是 YAML 文件中最常见的错误来源之一。使用支持 YAML 的编辑器或 linter 可以帮助发现这些问题。
YAML 提供了几种表示标量字符串(scalar strings)的方式:
- **普通(无引号)标量(Plain/Unquoted Scalars):**如果字符串不以特殊字符(如
{,[,-,#,&,*,!,|,>,’,”,%,@,`)开头,并且不包含像:或#这样的(非注释部分的冒号加空格或井号加空格)问题字符,通常可以不使用引号。示例:key: This is a plain string。 - **单引号标量(Single-Quoted Scalars)(
’):**当需要字面量包含特殊字符时很有用。在单引号内,字面量的单引号用两个相邻的单引号(”)表示。不执行其他转义(escaping)。示例:message: ‘It”s a beautiful day!’。 - **双引号标量(Double-Quoted Scalars)(
”):**允许使用 C 风格的转义序列(escape sequences)(例如,\n表示换行符,\t表示制表符,\表示反斜杠,”表示双引号)。如果双引号字符串中出现转义的换行符(</code> 后跟一个换行符),通常会被折叠成一个空格或移除,具体取决于上下文。示例:alert: “File not found.\nPlease check the path.”。 - **块标量(Block Scalars):**对于多行字符串,使用字面量样式(literal style)(
|)或折叠样式(folded style)(>),这已在单独的章节中讨论。
示例:在嵌套结构中使用字符串
Section titled “示例:在嵌套结构中使用字符串”
此示例展示了嵌套映射中使用的各种字符串,这在国际化(i18n)配置等文件中很常见:
errors: messages: already_confirmed: "was already confirmed, please try signing in" confirmation_period_expired: "needs to be confirmed within %{period}, please request a new one" expired: 'has expired, please request a new one' not_found: 'not found' not_locked: "was not locked" not_saved: one: "1 error prohibited this %{resource} from being saved:" other: "%{count} errors prohibited this %{resource} from being saved:"
选择合适的字符串样式取决于字符串内容和可读性偏好。如果可能,通常首选普通标量(Plain scalars)以保持简洁。