Странное поведение ruby ​​to_yaml - PullRequest
2 голосов
/ 04 января 2012

У меня странная проблема с различием в поведении to_yaml.Для:

"0111".to_yaml

возвращается:

"--- \"0111\"\n"

В то же время это:

"0128".to_yaml

возвращает:

"--- 0128\n"

Каквы видите, что первый вывод имеет "", а второй - нет.

Есть идеи?

Среда: MRI Ruby 1.9.2 и JRuby 1.6.5 (режим 1.9).

Ответы [ 2 ]

4 голосов
/ 04 января 2012

Я полагаю, что Евгений прав в отношении причины этой проблемы - кажется, что парсер по-разному обрабатывает строки, содержащие действительные восьмеричные числа.

Если вам это не нравится, вы можете переключиться на другой анализатор YAML. Согласно документам доступно два парсера: Syck и Psych. Первый является старым и не поддерживается, а второй является его заменой.

Psych используется в последних версиях Rails и является движком YAML по умолчанию в 1.9.3. Но вы можете легко использовать его в 1.9.2 и увидеть разницу:

require 'yaml'

p YAML::ENGINE.yamler      # => "syck"
# or explicitly set YAML::ENGINE.yamler = "syck" in 1.9.3
p '01'.to_yaml             # => "--- \"01\"\n"
p '08'.to_yaml             # => "--- 08\n"
p YAML.load('01'.to_yaml)  # => "01"
p YAML.load('08'.to_yaml)  # => "08"

p YAML::ENGINE.yamler = "psych"
p '01'.to_yaml             # => "--- '01'\n"
p '08'.to_yaml             # => "--- '08'\n"
p YAML.load('01'.to_yaml)  # => "01"
p YAML.load('08'.to_yaml)  # => "08"

Как видите, не нужно беспокоиться о различном представлении строк в Syck, если вы используете один и тот же механизм для декодирования данных (в обоих случаях он возвращает исходные строки).

Если по какой-то причине вам требуется унифицированное представление для строк в YAML, вы можете переключиться на Psych (по крайней мере, в этом случае это более согласованно), но будьте осторожны, так как у вас могут возникнуть проблемы при попытке загрузить данные Psych который ранее был сброшен с Syck.

0 голосов
/ 04 января 2012

Я тоже могу продублировать. Я не уверен, что это делает, но, по-моему, это связано с тем, что «числа» в строке фактически являются восьмеричными числами. Точнее, первое восьмеричное, а второе нет. Если вы удалите 0, вы получите поведение с первого на обоих из них. Возможно, кто-то еще мог бы развить эту теорию.

1.9.2p290 :002 > "0111".to_yaml
  => "--- \"0111\"\n" 
1.9.2p290 :003 > "0128".to_yaml
  => "--- 0128\n" 
1.9.2p290 :004 > "\0111".to_yaml
  => "--- \"\\t1\"\n" 
1.9.2p290 :005 > "\0128".to_yaml
  => "--- \"\\n\\\n8\"\n" 
1.9.2p290 :006 > string = "0111"
  => "0111" 
1.9.2p290 :007 > string.class
 => String 
1.9.2p290 :008 > string.to_yaml
 => "--- \"0111\"\n" 
1.9.2p290 :009 > string = "111"
 => "111" 
1.9.2p290 :010 > string.to_yaml
 => "--- \"111\"\n" 
1.9.2p290 :011 > string = "128"
 => "128" 
1.9.2p290 :012 > string.to_yaml
 => "--- \"128\"\n"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...