Что делает один восклицательный знак в YAML?

Я работаю с YamlDotNet библиотека и я получаю эту ошибку при загрузке файла YAML:

при разборе тега не найден ожидаемый URI тега.

файл YAML должен быть хорошо сформирован, потому что он приходит справа от RoR. Ошибка, похоже, вызвана этим кодом:

formats:
  default: ! '%d-%m-%Y'
  long: ! '%d %B, %Y'
  short: ! '%d %b'

Я не эксперт, но я вижу из спецификации YAML, что вы можете использовать восклицательный знак для обозначения пользовательский объект / тип и два восклицательных знака для указания явного встроенного типа.

obj1: !custom # whatever
obj2: !!str "My string"

однако я не смог найти никакой ссылки на восклицательный знак, используемый, как указано выше. Что это значит, и почему библиотека YAML, которую я использую, не может ее разобрать? Обратите внимание, что если я удалю эти восклицательные знаки, файл будет проанализирован нормально.

1 ответов


Это "!"это" неспецифический тег".

YAML спецификация 1.2 остается (кроме 1.1):

, указав "!"неспецифическое свойство тега, узел затем будет разрешена" ванильная " последовательность, сопоставление или строка, по своему виду.

посмотреть здесь к тегу "grammar":

none    : Unspecified tag (automatically resolved by application).
'!'     : Non-specific tag (by default, "!!map"/"!!seq"/"!!str").
'!foo'  : Primary (by convention, means a local "!foo" tag).
'!!foo' : Secondary (by convention, means "tag:yaml.org,2002:foo").
'!h!foo': Requires "%TAG !h! <prefix>" (and then means "<prefix>foo").
'!<foo>': Verbatim tag (always means "foo").

почему YamlDotNet выдает ошибку? Я не могу быть на 100% уверен, но я думаю, что вы нашли ошибку.

YamlDotNet является портом LibYAML, поэтому легко сравнить источников.

линия 2635 сканера.c (LibYAML):

/* Check if the tag is non-empty. */
if (!length) {

линия 2146 сканера.cs (YamlDotNet):

// Check if the tag is non-empty.
if (tag.Length == 0)

Я знаю, оба выглядят очень похожими, но на данный момент length 1 и tag.Length равен 0. Оригинальный код C позаботится о начальном "!"(вся длина), но C# этого не делает (только тег " name" длина.)

файл проблема для проекта.