Syntax YAML:在YAML中字符串需要引号吗?

Syntax YAML:在YAML中字符串需要引号吗?,syntax,yaml,quotes,Syntax,Yaml,Quotes,我正试图为Rails项目的国际化编写一本YAML词典。但我有点困惑,因为在一些文件中,我看到字符串用双引号括起来,而在一些文件中没有。需要考虑的几点: -所有字符串都使用双引号 -没有字符串(最后两个除外)使用引号 声明:用双引号括起来的字符串允许您使用转义来表示ASCII和Unicode字符。这是否意味着仅当我想转义某些字符时才需要使用双引号?如果是-为什么他们在第一个例子中到处使用双引号-只是为了统一/风格的原因 示例2的最后两行使用-非特定的标记,而第一个示例的最后两行则没有-它们都可以

我正试图为Rails项目的国际化编写一本YAML词典。但我有点困惑,因为在一些文件中,我看到字符串用双引号括起来,而在一些文件中没有。需要考虑的几点:

  • -所有字符串都使用双引号
  • -没有字符串(最后两个除外)使用引号
  • 声明:用双引号括起来的字符串允许您使用转义来表示ASCII和Unicode字符。这是否意味着仅当我想转义某些字符时才需要使用双引号?如果是-为什么他们在第一个例子中到处使用双引号-只是为了统一/风格的原因
  • 示例2的最后两行使用
    -非特定的标记,而第一个示例的最后两行则没有-它们都可以工作
我的问题是:YAML中使用不同类型引号的规则是什么

是否可以说:

  • 一般来说,你不需要报价
  • 如果要转义字符,请使用双引号
  • 使用
    单引号,何时
    
在简要回顾了问题中引用的YAML烹饪书并进行了一些测试后,以下是我的解释:

  • 一般来说,您不需要引用
  • 使用引号强制输入字符串,例如,如果您的键或值是
    10
    ,但希望它返回字符串而不是Fixnum,请编写
    '10'
    “10”
  • 如果您的值包含特殊字符,请使用引号,(例如,
    {
    &
    *
  • 单引号允许您在字符串中放入几乎任何字符,并且不会尝试解析转义码<代码>'\n'将作为字符串
    \n
    返回
  • 双引号解析转义码<代码>“\n”将作为换行符返回
  • 感叹号介绍了一种方法,例如
    !ruby/sym
    返回一个ruby符号
在我看来,最好的方法是不使用引号,除非你必须这样做,然后使用单引号,除非你特别想处理转义码

更新

“是”和“否”应包含在引号中(单引号或双引号),否则它们将被解释为TrueClass和FalseClass值:

en:
  yesno:
    'yes': 'Yes'
    'no': 'No'

在使用Docker开发Rails应用程序时,我就有过这种担心

我最喜欢的方法是通常不使用引号。这包括使用引号:

  • ${RAILS\u ENV}
  • 用冒号(:)分隔的值,如
    postgres-log:/var/log/postgresql
  • 其他字符串值
一、 但是,对于需要转换为字符串的
整数
值,请使用双引号,如:

  • docker编写版本,如
    版本:“3.8”
  • 端口号,如“8080:8080”
  • 图像
    “traefik:v2.2.1”
但是,对于特殊情况,如
布尔值
浮点值
整数
,以及其他可能将输入值使用双引号解释为
字符串
,请不要使用双引号

下面是一个示例
docker compose.yml
文件来解释这个概念:

版本:“3”
服务:
特拉菲克:
图片:“traefik:v2.2.1”
命令:
---api.unsecure=true#不要在生产中这样做
---providers.docker=true
---providers.docker.exposedbydefault=false
---entrypoints.web.address=:80
端口:
- "80:80"
- "8080:8080"
卷数:
-/var/run/docker.sock:/var/run/docker.sock:ro
就这些


我希望这会有所帮助

被标记为正确答案的答案具有极大的误导性。(虽然它解释了yaml one在野外遇到的情况)

只有当值(的开头)可能被误解为数据类型时,yaml中的字符串才需要引号,或者该值包含“:”(因为它可能被误解为键)

比如说

foo:“{{bar}”
需要引号,因为它可能被误解为数据类型
dict
,但是

foo:barbaz{{{bam}
不会,因为它不以关键字符开头。其次,

foo:'123'
需要引号,因为它可能被误解为数据类型
int
,但是

foo:bar1baz234
酒吧:123baz
不会,因为它不能被误解为
int

foo:“是”
需要引号,因为它可能被误解为数据类型
bool

foo:“bar:baz:bam”
需要引号,因为值可能会被误解为键

这些只是例子。使用
yamlint
有助于避免使用错误的令牌启动值

foo@bar:/tmp$yamlint test.yaml
test.yaml
3:4错误语法错误:找到无法启动任何令牌的字符“@”(语法)
如果与yaml合作富有成效,这是必须的


引用一些人建议的所有字符串就像在python中使用括号一样。这是一种不好的做法,损害了可读性,并抛弃了不必引用字符串的美妙特性。在传播虚假知识之前,请阅读文档。

虽然Mark的回答很好地总结了根据YAML语言规则何时需要引用,但我认为许多开发人员/管理员在使用YAML字符串时问自己的问题是“我的手的经验法则是什么