YAML: YAML'deki dizeler için tırnak işaretlerine ihtiyacım var mı?


398

Bir Rails projesinin uluslararasılaşması için bir YAML sözlüğü yazmaya çalışıyorum. Biraz kafam karıştı, bazı dosyalarda olduğu gibi çift tırnak içinde ve bazılarında dizeleri görüyorum. Dikkate alınması gereken birkaç nokta:

  • örnek 1 - tüm dizeler çift tırnak kullanır;
  • örnek 2 - dizge yok (son ikisi hariç) tırnak işareti kullanır;
  • YAML yemek kitabı diyor ki: çift tırnak dizeleri Çevreleyen ASCII ve Unicode karakterleri temsil etmek escapings kullanmasına olanak tanır. Bu, yalnızca bazı karakterlerden kaçmak istediğimde çift tırnak kullanmam gerektiği anlamına mı geliyor? Cevabınız evet ise - neden ilk örnekte her yerde çift tırnak kullanıyorlar - sadece birlik / stilistik nedenlerle?
  • örnek 2'nin son iki satırı !- spesifik olmayan etiket kullanırken, ilk örneğin son iki satırı kullanılmaz - ve ikisi de çalışır.

Benim sorum: YAML'de farklı teklif türlerini kullanma kuralları nelerdir?

Şöyle söylenebilir:

  • genel olarak, tırnak işareti gerekmez;
  • karakter kaçmak istiyorsanız çift tırnak kullanın;
  • Kullanım !tek tırnak ile, ne zaman ...?!?

1
İkinci bağlantı artık çalışmıyor, örneklerinizi soruya koymanızı öneririm.
eroin

Yanıtlar:


565

Soruda ve bazı testlerde belirtilen YAML yemek kitabının kısa bir incelemesinden sonra, benim yorumum:

  • Genel olarak, alıntılara ihtiyacınız yoktur.
  • Bir dizeyi zorlamak için tırnak işareti kullanın, örneğin anahtarınız veya değeriniz 10ancak bir Fixnum değil, bir String döndürmek istiyorsanız, yazın '10'veya "10".
  • Değeriniz özel karakterler içeriyorsa tırnak içine alın (örneğin :, {, }, [, ], ,, &, *, #, ?, |, -, <, >, =, !, %, @, \).
  • Tek tırnak işaretleri, dizenize neredeyse her karakteri koymanıza izin verir ve kaçış kodlarını ayrıştırmaya çalışmaz. '\n'dize olarak döndürülür \n.
  • Çift tırnak kaçış kodlarını ayrıştırır. "\n"satır besleme karakteri olarak döndürülür.
  • Ünlem işareti, !ruby/symbir Ruby sembolü döndürmek için bir yöntem sunar .

Bana öyle geliyor ki, en iyi yaklaşım, gerekmedikçe tırnak işareti kullanmak değil, özellikle kaçış kodlarını işlemek istemediğiniz sürece tek tırnak işareti kullanmak olacaktır.

Güncelleme

"Evet" ve "Hayır" tırnak içine alınmalıdır (tek veya çift), aksi takdirde TrueClass ve FalseClass değerleri olarak yorumlanacaktır:

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

16
Bu tam resim değil. Örneğin, @ve `, ayrılmış göstergeler oldukları için başlangıçta düz bir dizede herhangi bir yerde kullanılabilir .
Adam Spires

19
Tam resmi sağlamaya çalışmıyordum, sadece bazı kurallar. Evet, bazen, bazı özel karakterler (ayrılmış göstergeler) tırnak işaretleri olmadan kullanılabilir (ayrılmış bir gösterge düz bir skaler başlatmadığı sürece), ancak özel bir karakter gördüğünüzde tırnak işareti kullanmak yanlış değildir.
Mark Berry

33
YAML'deki dizelerin kuralları inanılmaz derecede karmaşıktır, çünkü çok farklı dizeler vardır. Burada bir tablo yazdım: stackoverflow.com/questions/3790454/…
Steve Bennett

56
Tüm bu uyarılar göz önüne alındığında, sadece her yerde tırnak kullanmayı tercih ederim: - /
Vicky Chijwani

6
Ayrıca, yazdığım oldukça eksiksiz bir referans: blogs.perl.org/users/tinita/2018/03/…
tinita

0

Docker ile bir Rails uygulaması üzerinde çalışırken bu endişe vardı .

En çok tercih ettiğim yaklaşım genellikle tırnak işaretleri kullanmak değil . Bu içerir değil tırnak kullanılarak:

  • gibi değişkenler ${RAILS_ENV}
  • iki nokta üst üste (:) ile ayrılmış değerler postgres-log:/var/log/postgresql
  • diğer dize değerleri

Ancak, integergibi dizeleri dönüştürülmesi gereken değerler için çift tırnak kullanın :

  • docker-compose sürümü gibi version: "3.8"
  • gibi bağlantı noktası numaraları "8080:8080"

Özel durumlar gibi Ancak, booleans, floats, integers, giriş değerleri için çift tırnak kullanarak diğer durumlarda, olarak yorumlanabilir strings, lütfen değil çift tırnak kullanır.

İşte docker-compose.ymlbu kavramı açıklayan örnek bir dosya:

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

Bu kadar.

Umarım bu yardımcı olur

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.