2012-01-04 53 views
2

我得到这个奇怪的问题与to_yaml行为的差异。适用于:奇怪的红宝石to_yaml行为

"0111".to_yaml 

返回:

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

同时此:

"0128".to_yaml 

回报:

"--- 0128\n" 

正如你所看到的第一个输出具有""但第二个没有。

有什么想法?

环境:MRI Ruby 1.9.2和JRuby 1.6.5(1.9模式)。

回答

4

我相信尤金是对有关这些问题的原因 - 好像包含有效八进制数不同分析器把字符串。

如果你不喜欢它,你可以切换到不同的YAML分析器。根据docs有两个解析器可用:SyckPsych。前者老旧无人居住,后者是替代品。

Psych用于最新版本的Rails,并且是1.9.3中的默认YAML引擎。但是你可以很容易地使用它在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

这就是我需要的!谢谢! – agate 2012-01-05 05:23:13

+0

不知道YAML解析器在1.9.3中更改了,很有意思。谢谢你的提示! – Eugene 2012-01-09 16:22:57

+0

我在OS X上运行'ruby 1.9.3p194'(通过RVM安装),即使'YAML :: ENGINE.yamler'报告了'psych''我也想用'08'和' “09''。 – 2012-08-09 04:11:53

0

我可以重复这一点。我不知道是什么做的,但我的第一个猜测是,它与字符串中的“数字”实际上是八进制数。或者更准确地说,第一个是八进制,第二个不是。如果你删除了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" 
+0

我只是觉得这种行为很奇怪。我测试其他yaml实现像js-yaml。似乎他们以正确的方式处理这个... – agate 2012-01-05 05:19:18