YAML: Apakah saya perlu penawaran untuk string di YAML?

398

Saya mencoba menulis kamus YAML untuk internasionalisasi proyek Rails. Saya agak bingung, karena dalam beberapa file saya melihat string dalam tanda kutip ganda dan beberapa tanpa. Beberapa hal yang perlu dipertimbangkan:

  • contoh 1 - semua string menggunakan tanda kutip ganda;
  • contoh 2 - tanpa string (kecuali dua yang terakhir) menggunakan tanda kutip;
  • yang masak YAML mengatakan: Melampirkan string dalam tanda kutip ganda memungkinkan Anda untuk menggunakan escapings untuk mewakili ASCII dan Unicode karakter. Apakah ini berarti saya perlu menggunakan tanda kutip ganda hanya ketika saya ingin melarikan diri beberapa karakter? Jika ya - mengapa mereka menggunakan tanda kutip ganda di mana-mana dalam contoh pertama - hanya demi alasan persatuan / gaya?
  • dua baris terakhir dari contoh 2 menggunakan !- tag non-spesifik, sedangkan dua baris terakhir dari contoh pertama tidak - dan keduanya bekerja.

Pertanyaan saya adalah: apa aturan untuk menggunakan berbagai jenis kutipan dalam YAML?

Mungkinkah dikatakan bahwa:

  • secara umum, Anda tidak perlu penawaran;
  • jika Anda ingin melarikan diri karakter menggunakan tanda kutip ganda;
  • gunakan !dengan tanda kutip tunggal, kapan ...?!?
Alexander
sumber
1
Tautan kedua tidak berfungsi lagi, saya sarankan untuk memberikan contoh Anda ke pertanyaan.
heroin

Jawaban:

565

Setelah ulasan singkat tentang buku masak YAML yang dikutip dalam pertanyaan dan beberapa pengujian, inilah interpretasi saya:

  • Secara umum, Anda tidak perlu penawaran.
  • Gunakan tanda kutip untuk memaksa string, misalnya jika kunci atau nilai 10Anda tetapi Anda ingin itu mengembalikan String dan bukan Fixnum, tulis '10'atau "10".
  • Gunakan tanda kutip jika nilai Anda termasuk karakter khusus, (misalnya :, {, }, [, ], ,, &, *, #, ?, |, -, <, >, =, !, %, @, \).
  • Kutipan tunggal memungkinkan Anda menempatkan hampir semua karakter di string Anda, dan tidak akan mencoba mengurai kode melarikan diri. '\n'akan dikembalikan sebagai string \n.
  • Kutipan ganda parse kode melarikan diri. "\n"akan dikembalikan sebagai karakter umpan baris.
  • Tanda seru memperkenalkan metode, misalnya !ruby/symuntuk mengembalikan simbol Ruby.

Menurut saya, pendekatan terbaik adalah tidak menggunakan tanda kutip kecuali Anda harus, dan kemudian menggunakan tanda kutip tunggal kecuali jika Anda secara khusus ingin memproses kode pelarian.

Memperbarui

"Ya" dan "Tidak" harus dilampirkan dalam tanda kutip (tunggal atau ganda) atau kalau tidak mereka akan ditafsirkan sebagai nilai TrueClass dan FalseClass:

en:
  yesno:
    'yes': 'Yes'
    'no': 'No'
Mark Berry
sumber
16
Itu bukan gambaran lengkapnya. Misalnya, @dan `dapat digunakan di mana saja dalam string biasa kecuali di awal, karena mereka adalah indikator yang dicadangkan .
Adam Spires
19
Saya tidak berusaha memberikan gambaran lengkap, hanya beberapa aturan praktis. Ya, sepertinya kadang-kadang, beberapa karakter khusus (indikator yang dipesan) dapat digunakan tanpa tanda kutip (selama indikator yang dipesan tidak memulai skalar biasa), tetapi tidak salah menggunakan tanda kutip setiap kali Anda melihat karakter khusus.
Mark Berry
33
Aturan untuk string dalam YAML sangat rumit, karena ada banyak jenis string yang berbeda. Saya menulis tabel di sini: stackoverflow.com/questions/3790454/…
Steve Bennett
56
Mengingat semua peringatan ini, saya lebih suka menggunakan tanda kutip di mana-mana: - /
Vicky Chijwani
6
Juga, inilah referensi yang cukup lengkap yang saya tulis: blogs.perl.org/users/tinita/2018/03/…
tinita
0

Saya memiliki masalah ini ketika bekerja pada aplikasi Rails dengan Docker .

Pendekatan saya yang paling disukai adalah umumnya tidak menggunakan tanda kutip. Ini termasuk tidak menggunakan kutipan untuk:

  • variabel suka ${RAILS_ENV}
  • nilai dipisahkan oleh titik dua (:) like postgres-log:/var/log/postgresql
  • nilai string lainnya

Namun, saya menggunakan tanda kutip ganda untuk integernilai yang perlu dikonversi ke string seperti:

  • seperti versi docker-compose version: "3.8"
  • seperti nomor port "8080:8080"

Namun, untuk kasus-kasus khusus seperti booleans, floats, integers, dan kasus-kasus lainnya, di mana menggunakan tanda kutip ganda untuk nilai masuk bisa diartikan sebagai strings, jangan tidak menggunakan tanda kutip ganda.

Berikut ini contoh docker-compose.ymlfile untuk menjelaskan konsep ini:

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

Itu saja.

saya harap ini membantu

Janji Preston
sumber