YAML сбрасывает непоследовательную кодировку строки

#ruby-on-rails #ruby #yaml

#ruby-on-rails #ruby #yaml

Вопрос:

Версия Ruby: 2.2.5 Версия Rails: ‘~> 4.0.13’

Почему я и мой друг получили разный результат при попытке преобразовать строку в YAML с помощью YAML.dump метода?

 [1] pry(main)> YAML.dump("foo")
=> "--- foon"
[2] pry(main)> "foo".to_yaml
=> "--- foon"
  

Пока у него есть:

 [1] pry(main)> YAML.dump("foo")
=> "--- foon...n"
[2] pry(main)> "foo".to_yaml
=> "--- foon...n"
  

С тройными точками после новой строки (…)

ОБНОВЛЕНО

Я подтвердил, что мои rails используют Psych в качестве механизма синтаксического анализа YAML в консоли rails:

 2.2.5 :002 > YAML
 => Psych
2.2.5 :004 > Psych.dump("foo")
 => "--- foon"
2.2.5 :005 > YAML.dump("foo")
 => "--- foon"
2.2.5 :006 >
  

Но все же результат как-то отличается. Для получения дополнительной информации у меня не установлен какой-либо syck gem, и он не требуется ни в каких файлах в моем проекте rails.

Комментарии:

1. Вы выяснили, почему это было? Сегодня у меня такая же проблема, и я понятия не имею, почему. Это вызывает некоторые проблемы между разными системами

Ответ №1:

Похоже, «вы» можете использовать syck в качестве процессора YAML, пока «Он» использует psych . Например.

  require 'syck' 
 require 'psych'
 Syck.dump("foo")
 #=> "--- foon"
 Psych.dump("foo")
 #=> "--- foon...n"
  

Оба являются допустимыми анализаторами / эмиттерами YAML как таковыми, хотя Psych был предпочтительным с 1.9 и Syck действительно существует только как драгоценный камень для обратной совместимости и был полностью удален из стандартной библиотеки ruby начиная с 2.0.0

Что касается того, почему «вы» каким-то образом используете Syck вместо этого, я не могу сказать без гораздо большего количества информации, чем было предоставлено в этом сообщении.

Комментарии:

1. Я проверил в своей консоли rails, что объект YAML, похоже, использует Psych . Но почему-то я все еще получаю приведенный выше результат.

Ответ №2:

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

Для libyaml версии 0.1.7 она всегда будет включать такие конечные символы, вот почему у вас есть дополнительный «… n».

Для libyaml версии 0.2.1 и выше он поддерживает неявное окончание, поэтому эти символы можно игнорировать