我得到這個奇怪的問題與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