YAML: Ho bisogno di virgolette per le stringhe in YAML?


398

Sto cercando di scrivere un dizionario YAML per l'internazionalizzazione di un progetto Rails. Sono un po 'confuso, come in alcuni file vedo stringhe tra virgolette e in alcune senza. Alcuni punti da considerare:

  • esempio 1 - tutte le stringhe usano virgolette doppie;
  • esempio 2 - nessuna stringa (tranne le ultime due) usa le virgolette;
  • il ricettario YAML dice: Racchiudere le stringhe tra virgolette doppie consente di utilizzare gli escape per rappresentare i caratteri ASCII e Unicode. Questo significa che devo usare le virgolette doppie solo quando voglio sfuggire ad alcuni personaggi? Se sì - perché usano le doppie virgolette ovunque nel primo esempio - solo per motivi di unità / motivi stilistici?
  • le ultime due righe dell'esempio 2 usano !- il tag non specifico, mentre le ultime due righe del primo esempio non lo fanno - ed entrambe funzionano.

La mia domanda è: quali sono le regole per l'utilizzo dei diversi tipi di virgolette in YAML?

Si potrebbe dire che:

  • in generale, non hai bisogno di virgolette;
  • se vuoi scappare dai personaggi usa le doppie virgolette;
  • utilizzare !con virgolette singole, quando ...?!?

1
Il secondo link non funziona più, suggerisco di inserire i tuoi esempi nella domanda.
eroina,

Risposte:


565

Dopo una breve recensione del ricettario YAML citato nella domanda e alcuni test, ecco la mia interpretazione:

  • In generale, non hai bisogno di virgolette.
  • Usa le virgolette per forzare una stringa, ad esempio se la tua chiave o valore è 10ma vuoi che restituisca una stringa e non un Fixnum, scrivi '10'o "10".
  • Usa virgolette se il valore include i caratteri speciali (ad esempio :, {, }, [, ], ,, &, *, #, ?, |, -, <, >, =, !, %, @, \).
  • Le virgolette singole consentono di inserire quasi tutti i caratteri nella stringa e non tentano di analizzare i codici di escape. '\n'verrebbe restituito come stringa \n.
  • Le virgolette doppie analizzano i codici di escape. "\n"verrebbe restituito come carattere di avanzamento riga.
  • Il punto esclamativo introduce un metodo, ad es. !ruby/symPer restituire un simbolo Ruby.

Mi sembra che l'approccio migliore sarebbe quello di non utilizzare le virgolette a meno che non sia necessario e quindi utilizzare le virgolette singole a meno che non si desideri elaborare codici di escape.

Aggiornare

"Sì" e "No" devono essere racchiusi tra virgolette (singole o doppie), altrimenti saranno interpretati come valori TrueClass e FalseClass:

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

16
Non è esattamente il quadro completo. Ad esempio, @e `può essere usato ovunque in una stringa semplice tranne all'inizio, perché sono indicatori riservati .
Adam Spires,

19
Non stavo cercando di fornire il quadro completo, solo alcune regole pratiche. Sì, a volte sembra che alcuni caratteri speciali (indicatori riservati) possano essere usati senza virgolette (purché un indicatore riservato non inizi un semplice scalare), ma non è sbagliato usare le virgolette ogni volta che vedi un carattere speciale.
Mark Berry,

33
Le regole per le stringhe in YAML sono follemente complicate, perché ci sono così tanti diversi tipi di stringhe. Ho scritto un tavolo qui: stackoverflow.com/questions/3790454/…
Steve Bennett,

56
Dati tutti questi avvertimenti, preferirei semplicemente usare le virgolette ovunque: - /
Vicky Chijwani,

6
Inoltre, ecco un riferimento abbastanza completo che ho scritto: blogs.perl.org/users/tinita/2018/03/…
tinita

0

Avevo questa preoccupazione quando lavoravo su un'applicazione Rails con Docker .

Il mio approccio preferito è generalmente di non usare le virgolette. Ciò include non usare le virgolette per:

  • variabili come ${RAILS_ENV}
  • valori separati da due punti (:) come postgres-log:/var/log/postgresql
  • altri valori di stringhe

Uso tuttavia le virgolette doppie per i integervalori che devono essere convertiti in stringhe come:

  • versione docker-compose come version: "3.8"
  • numeri di porta come "8080:8080"

Tuttavia, per i casi speciali come booleans, floats, integers, e altri casi, in cui utilizzando i doppi apici per i valori di ingresso potrebbero essere interpretati come strings, si prega di non utilizzare le virgolette doppie.

Ecco un docker-compose.ymlfile di esempio per spiegare questo concetto:

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

È tutto.

spero che questo possa essere d'aiuto

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.