我得到这个奇怪的问题与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模式)。
我得到这个奇怪的问题与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模式)。
我相信尤金是对有关这些问题的原因 - 好像包含有效八进制数不同分析器把字符串。
如果你不喜欢它,你可以切换到不同的YAML分析器。根据docs有两个解析器可用:Syck
和Psych
。前者老旧无人居住,后者是替代品。
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,你就会从第一个行为中获得行为。也许别人可以详细阐述这个理论。
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"
我只是觉得这种行为很奇怪。我测试其他yaml实现像js-yaml。似乎他们以正确的方式处理这个... – agate 2012-01-05 05:19:18
这就是我需要的!谢谢! – agate 2012-01-05 05:23:13
不知道YAML解析器在1.9.3中更改了,很有意思。谢谢你的提示! – Eugene 2012-01-09 16:22:57
我在OS X上运行'ruby 1.9.3p194'(通过RVM安装),即使'YAML :: ENGINE.yamler'报告了'psych''我也想用'08'和' “09''。 – 2012-08-09 04:11:53