YAML: мне нужны кавычки для строк в YAML?


398

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

  • пример 1 - все строки используют двойные кавычки;
  • пример 2 - без строк (кроме двух последних) используются кавычки;
  • поваренная YAML говорит: Вшита строка в двойных кавычках позволяет использовать escapings для представления ASCII и Unicode символов. Означает ли это, что мне нужно использовать двойные кавычки только тогда, когда я хочу экранировать некоторые символы? Если да - почему они используют двойные кавычки везде в первом примере - только ради единства / стилистических соображений?
  • последние две строки примера 2 используют !- неспецифический тег, тогда как последние две строки первого примера - нет, и они обе работают.

Мой вопрос: каковы правила использования различных типов цитат в YAML?

Можно ли сказать, что:

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

1
Вторая ссылка больше не работает, предлагаю поставить ваши примеры в вопрос.
героин

Ответы:


565

После краткого обзора поваренной книги YAML, процитированной в этом вопросе, и некоторого тестирования, вот моя интерпретация:

  • В общем, вам не нужны кавычки.
  • Используйте кавычки для форсирования строки, например, если ваш ключ или значение имеют значение, 10но вы хотите, чтобы оно возвращало String, а не Fixnum, write '10'или "10".
  • Используйте кавычки , если ваше значение включает в себя специальные символы (например :, {, }, [, ], ,, &, *, #, ?, |, -, <, >, =, !, %, @, \).
  • Одинарные кавычки позволяют вам поместить в строку практически любой символ и не будут пытаться анализировать escape-коды. '\n'будет возвращен как строка \n.
  • Двойные кавычки разбирают escape-коды. "\n"будет возвращен как символ перевода строки.
  • Восклицательный знак представляет метод, например, !ruby/symдля возврата символа Ruby.

Мне кажется, что лучшим подходом было бы не использовать кавычки без необходимости, а затем использовать одинарные кавычки, если вы специально не хотите обрабатывать escape-коды.

Обновить

«Да» и «Нет» должны быть заключены в кавычки (одинарные или двойные), иначе они будут интерпретироваться как значения TrueClass и FalseClass:

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

16
Это не совсем полная картина. Например, @и `можно использовать где угодно в простой строке, кроме как в начале, потому что они являются зарезервированными индикаторами .
Адам Спайерс

19
Я не пытался представить полную картину, просто некоторые правила. Да, иногда кажется, что некоторые специальные символы (зарезервированные индикаторы) могут использоваться без кавычек (если зарезервированный индикатор не запускает простой скаляр), но это не неправильно использовать кавычки всякий раз, когда вы видите специальный символ.
Марк Берри

33
Правила для строк в YAML безумно сложны, потому что есть много разных типов строк. Я написал таблицу здесь: stackoverflow.com/questions/3790454/…
Стив Беннетт

56
Учитывая все эти предостережения, я бы предпочел просто использовать цитаты везде: - /
Вики 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.