YAML: Чи потрібні мені лапки для рядків у YAML?


398

Я намагаюся написати словник YAML для інтернаціоналізації проекту Rails. Я трохи заплутався, хоча в деяких файлах я бачу рядки в подвійних лапках, а в деяких - без. Кілька моментів, які слід врахувати:

  • приклад 1 - всі рядки використовують подвійні лапки;
  • приклад 2 - без рядків (крім двох останніх) використовуються лапки;
  • у кулінарній книзі YAML зазначається: Закривання рядків у подвійних лапках дозволяє використовувати пропуски для представлення символів ASCII та Unicode. Чи означає це, що мені потрібно використовувати подвійні лапки лише тоді, коли я хочу уникати деяких символів? Якщо так - чому вони використовують подвійні лапки скрізь у першому прикладі - лише заради єдності / стилістичних причин?
  • в останніх двох рядках прикладу 2 використовується !- неспецифічний тег, тоді як останні два рядки першого прикладу - ні, і вони обидва працюють.

Моє запитання: які правила використання різних типів лапок в YAML?

Чи можна сказати, що:

  • загалом, вам не потрібні цитати;
  • якщо ви хочете уникнути символів, використовуйте подвійні лапки;
  • використовувати !з одиничними цитатами, коли ...?!?

1
Друге посилання вже не працює, пропоную поставити ваші приклади до питання.
героїн

Відповіді:


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

Я мав це занепокоєння під час роботи над додатком Rails з Docker .

Мій найбільш переважний підхід - це взагалі не використовувати лапки. Це включає не використання лапок для:

  • змінні типу ${RAILS_ENV}
  • значення, розділені двокрапкою (:), як postgres-log:/var/log/postgresql
  • інші значення рядків

Я, однак, використовую подвійні лапки для integerзначень, які потрібно перетворити на рядки типу:

  • версія докер-композиція, як version: "3.8"
  • номери портів, як "8080:8080"

Однак, для особливих випадків , як booleans, floats, integers, та інші випадки, коли з допомогою подвійних лапок для значень входу можуть бути витлумачені як 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

Це все.

Я сподіваюся, що це допомагає

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.