Ale*_*pov 349 syntax quotes yaml
我正在尝试编写一个YAML字典,用于Rails项目的国际化.我有点困惑,因为在一些文件中,我看到双引号中的字符串,而有些没有.需要考虑以下几点:
!- 非特定标记,而第一个示例的最后两行不使用 - 它们都有效.我的问题是:在YAML中使用不同类型的引号有哪些规则?
可以这么说:
!单引号,当...?!?Mar*_*rry 492
在简要回顾了问题中引用的YAML食谱和一些测试之后,这是我的解释:
10但您希望它返回String而不是Fixnum,写'10'或"10".:,{,},[,],,,&,*,#,?,|,-,<,>,=,!,%,@,\).'\n'将作为字符串返回\n."\n"将作为换行符返回.!ruby/sym返回Ruby符号.在我看来,最好的方法是不使用引号,除非你必须,然后使用单引号,除非你特别想要处理转义码.
更新
"是"和"否"应该用引号(单引号或双引号)括起来,否则它们将被解释为TrueClass和FalseClass值:
en:
yesno:
'yes': 'Yes'
'no': 'No'
Run Code Online (Sandbox Code Playgroud)
F1k*_*1ko 75
这个问题有一些很好的答案。\n但是,我想扩展它们并提供新的官方 YAML v1.2.2 规范(2021 年 10 月 1 日发布)的一些上下文,这是考虑 YAML 的所有事物的“真正来源” 。
\n可以使用三种不同的样式来表示字符串,每种样式都有自己的(缺点)优点:
\n\n\nYAML 提供三种流标量样式:双引号、单引号和普通(不带引号)。每一种都在可读性和表达能力之间提供了不同的权衡。
\n
双引号样式:
\n\n\n\n
\n- 双引号样式由周围的
\n"指示符指定。这是唯一能够通过使用\\转义序列来表达任意字符串的样式。这是以必须转义\\和"字符为代价的。
单引号样式:
\n\n\n\n
\n- 单引号样式由周围的
\n\'指示符指定。因此,在单引号标量内,需要重复此类字符。这是在单引号标量中执行的唯一转义形式。特别是,\\和"字符可以自由使用。这将单引号标量限制为可打印字符。此外,只能在空格字符被非空格包围的长单引号行中打断。
普通(不带引号)样式:
\n\n\n\n
\n- 普通(未引用)样式没有识别指示符,并且不提供任何形式的转义。因此,它是最具可读性、最受限制且对上下文最敏感的风格。除了受限制的字符集之外,普通标量不能为空或包含前导或尾随空白字符。只能在空格字符被非空格包围的长普通行中打断。\n普通标量不得以大多数指示符开头,因为这会导致与其他 YAML 构造产生歧义。但是,如果
\n:,?和-指示符后跟非空格 \xe2\x80\x9csafe\xe2\x80\x9d 字符,则可以将 , 和 指示符用作第一个字符,因为这不会导致歧义。
长话短说
\n话虽如此,根据官方 YAML 规范,应该:
\n\'诸如"和 之类的字符,请使用单引号样式 ( ) 以避免转义它们,从而提高可读性。\\"当前两个选项不够时,即需要更复杂的换行符或需要不可打印字符的情况下,请使用双引号样式 ( )。小智 24
仅当值(的开头)可能被误解为数据类型或值包含“:”(因为它可能被误解为键)时,yaml 中的字符串才需要引号。
例如
foo: '{{ bar }}'
Run Code Online (Sandbox Code Playgroud)
需要引号,因为它可能会被误解为 datatype dict,但是
foo: barbaz{{ bam }}
Run Code Online (Sandbox Code Playgroud)
不是,因为它不以关键 char 开头。下一个,
foo: '123'
Run Code Online (Sandbox Code Playgroud)
需要引号,因为它可能会被误解为 datatype int,但是
foo: bar1baz234
bar: 123baz
Run Code Online (Sandbox Code Playgroud)
不会,因为它不能被误解为int
foo: 'yes'
Run Code Online (Sandbox Code Playgroud)
需要引号,因为它可能会被误解为数据类型bool
foo: "bar:baz:bam"
Run Code Online (Sandbox Code Playgroud)
需要引号,因为该值可能会被误解为键。
这些只是示例。使用yamllint有助于避免以错误的标记开始值
foo@bar:/tmp$ yamllint test.yaml
test.yaml
3:4 error syntax error: found character '@' that cannot start any token (syntax)
Run Code Online (Sandbox Code Playgroud)
如果要高效地使用 yaml,那么这是必须的。
正如一些人建议的那样引用所有字符串,就像在 python 中使用括号一样。这是不好的做法,会损害可读性并放弃不必引用字符串的美丽功能。
虽然 Mark 的回答很好地总结了根据 YAML 语言规则何时需要引号,但我认为许多开发人员/管理员在使用 YAML 中的字符串时会问自己的问题是“我处理刺痛的经验法则应该是什么??”
这听起来可能很主观,但是如果您只想在按照语言规范真正需要引号时才使用引号,那么您必须记住的规则数量对于指定最常见数据类型之一这样简单的事情来说有些过分. 不要误会我的意思,您最终会在定期使用 YAML 时记住它们,但是如果您偶尔使用它,并且您没有开发编写 YAML 的自动化呢?您真的想花时间记住所有规则只是为了正确指定字符串吗?
“经验法则”的全部意义在于节省认知资源并在不考虑它的情况下处理常见任务。我们的“CPU”时间可以说比正确处理字符串更有用。
从这个纯粹实用的角度来看,我认为最好的经验法则是单引号字符串。背后的道理:
这些只是一些偶尔使用 YAML 的用户要记住的 2 条规则,从而最大限度地减少认知工作。
| 归档时间: |
|
| 查看次数: |
142909 次 |
| 最近记录: |