YAML:我需要在YAML中使用双引号吗?


398

我正在尝试编写有关Rails项目国际化的YAML字典。不过,我有些困惑,因为在某些文件中,我看到字符串用双引号引起来,而在某些文件中则没有。需要考虑的几点:

  • 示例1-所有字符串都使用双引号;
  • 示例2-没有字符串(最后两个除外)使用引号;
  • YAML菜谱说:双引号引起的字符串允许您使用escapings代表ASCII和Unicode字符。这是否意味着仅在我要转义某些字符时才需要使用双引号?如果是,为什么-在第一个示例中为什么在所有地方都使用双引号-仅出于统一/风格方面的原因?
  • 示例2的最后两行使用了!-非特定标记,而第一个示例的最后两行没有使用-并且它们都起作用。

我的问题是:在YAML中使用不同类型的报价的规则是什么?

可以这样说:

  • 通常,您不需要引号;
  • 如果要转义字符,请使用双引号;
  • !当...?!?时使用单引号

1
第二个链接不再起作用,我建议将您的示例放入问题中。
海洛因

Answers:


565

在对问题中引用的YAML食谱进行简短回顾并进行了一些测试之后,以下是我的解释:

  • 通常,您不需要引号。
  • 使用引号强制字符串,例如,如果您的键或值是,10但您希望它返回字符串而不是Fixnum,则使用write '10'"10"
  • 使用引号如果值包含特殊字符(例如:{}[],&*#?|-<>=!%@\)。
  • 单引号使您几乎可以在字符串中放入任何字符,并且不会尝试解析转义码。'\n'将作为字符串返回\n
  • 双引号解析转义码。 "\n"将作为换行符返回。
  • 感叹号引入了一种方法,例如!ruby/sym返回Ruby符号。

在我看来,最好的方法是除非必须使用引号,否则不要使用引号,除非您特别想处理转义码,否则使用单引号。

更新资料

“是”和“否”应该用引号引起来(单引号或双引号),否则它们将被解释为TrueClass和FalseClass值:

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

16
这还不完整。例如,@和`可以在纯字符串中的任意位置(除了开头)使用,因为它们是保留的指示符
亚当·斯皮尔斯

19
我并没有提供全部图片,只是一些经验法则。是的,看起来有时候,某些特殊字符(保留指示符)可以不带引号使用(只要保留指示符不以普通标量开头),但是只要看到特殊字符就可以使用引号。
马克·贝里

33
YAML中的字符串规则非常复杂,因为存在许多不同类型的字符串。我在这里写了一张桌子:stackoverflow.com/questions/3790454/…–
史蒂夫·贝内特

56
考虑到所有这些警告,我宁愿在各处都使用引号:-/
Vicky Chijwani

6
另外,这是我写的一个很完整的参考:blogs.perl.org/users/tinita/2018/03/…–
tinita

0

Docker上使用Rails应用程序时,我有这个担忧。

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

  • 像这样的变量 ${RAILS_ENV}
  • 用冒号(:)分隔的值,例如 postgres-log:/var/log/postgresql
  • 其他字符串值

但是,我对integer需要将其转换为字符串的值使用双引号:

  • docker-compose版本,例如 version: "3.8"
  • 端口号,例如 "8080:8080"

但是,对于特殊情况下,像booleansfloatsintegers,等情况下,如果使用双引号的项值可以被解释为strings,请不要使用双引号。

这是一个docker-compose.yml解释此概念的样本文件:

version: "3"

services:
  traefik:
    image: traefik:v2.2.1
    command:
      - --api.insecure=true # Don't do that in production
      - --providers.docker=true
      - --providers.docker.exposedbydefault=false
      - --entrypoints.web.address=:80
    ports:
      - "80:80"
      - "8080:8080"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro

就这样。

我希望这有帮助

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.