#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 и выше он поддерживает неявное окончание, поэтому эти символы можно игнорировать