2012-01-04 118 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