YAML:YAMLで文字列の引用符は必要ですか?


398

Railsプロジェクトの国際化対応のYAML辞書を作成しようとしています。ただし、一部のファイルでは文字列が二重引用符で囲まれている場合とない場合があるため、少し混乱しています。考慮すべきいくつかの点:

  • 例1-すべての文字列は二重引用符を使用します。
  • 例2-引用符を使用しない文字列(最後の2つを除く)。
  • YAMLクックブックによれば、文字列を二重引用符で囲むと、エスケープを使用してASCIIおよびUnicode文字を表すことができます。これは、一部の文字をエスケープする場合にのみ二重引用符を使用する必要があることを意味しますか?はいの場合-最初の例のどこでも二重引用符を使用するのはなぜですか-統一性/スタイル上の理由からのみですか?
  • 例2の最後の2行は!非特定タグを使用しますが、最初の例の最後の2行は使用しません-両方とも機能します。

私の質問は、YAMLでさまざまなタイプの引用符を使用するためのルールは何ですか?

次のように言えますか:

  • 通常、引用符は必要ありません。
  • 文字をエスケープする場合は二重引用符を使用します。
  • !単一引用符で使用する場合、...?!?

1
2番目のリンクが機能しなくなったので、例を質問に追加することをお勧めします。
ヘロイン

回答:


565

質問といくつかのテストで引用されたYAMLクックブックの簡単なレビューの後、これが私の解釈です。

  • 通常、引用符は必要ありません。
  • 引用符を使用して文字列を強制します。たとえば、キーまたは値がそうである10が、Fixnumではなく文字列を返すようにしたい場合は、書き込み'10'または"10"です。
  • お使いの値に特殊文字が含まれている場合、引用符を使用します(例えば:{}[],&*#?|-<>=!%@\)。
  • 一重引用符を使用すると、文字列にほとんどすべての文字を含めることができ、エスケープコードを解析しようとしません。'\n'文字列として返されます\n
  • 二重引用符はエスケープコードを解析します。 "\n"改行文字として返されます。
  • 感嘆符は!ruby/sym、Rubyシンボルを返すなどのメソッドを導入します。

最善の方法は、必要がない限り引用符を使用せず、エスケープコードを特に処理する必要がない限り、単一引用符を使用することだと私には思われます。

更新

「はい」と「いいえ」は引用符(シングルまたはダブル)で囲む必要があります。そうしないと、TrueClassおよびFalseClassの値として解釈されます。

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

16
それは完全な全体像ではありません。たとえば、@andは予約済みのインジケータであるため、先頭以外のプレーンな文字列のどこでも使用できます。
Adam Spiers、2015年

19
私は全体像を提供しようとするのではなく、いくつかの経験則を提供しました。はい、時々、一部の特殊文字(予約済みインジケーター)は引用符なしで使用できます(予約済みインジケーターが単純なスカラーを開始しない限り)ようですが、特殊文字が表示されるときは常に引用符を使用することは間違いありません。
Mark Berry

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

それで全部です。

これが役に立てば幸い

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.