2012-01-04 32 views
2

私はこの奇妙な問題を持っています。振る舞いの違いはto_yamlです。以下の場合:ruby​​ to_yamlの奇妙な振る舞い

"0111".to_yaml 

それが返されます。同時に、

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

この:

"0128".to_yaml 

リターン:

"--- 0128\n" 

""を持っているあなたが最初の出力を見ることができるようにしかし、第二はしません。

環境:MRI Ruby 1.9.2およびJRuby 1.6.5(1.9モード)。

答えて

4

私はEugeneがこれらの問題の理由について正しいと思っています。パーサーは、有効な8進数を含む文字列を別々に扱うようです。

好きではない場合は、別のYAMLパーサーに切り替えることができます。 docsによれば、利用可能なパーサーは、SyckPsychです。前者は古いものであり、後者はその代用品である。

Psychは、Railsの最新バージョンで使用され、1.9.3のデフォルトのYAMLエンジンです。あなたがいる限りあなたが同じエンジンを使用しているようSyck内の文字列の異なる表現を心配する必要はありません見ることができるように

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" 

:しかし、あなたは簡単に1.9.2でそれを使用して違いを見ることができますデータをデコードします(どちらの場合も元の文字列を返します)。

は、何らかの理由であなたは(それが、少なくともこの場合に、より一貫性のある)Psychに切り替えていますが、以前だっPsychデータをロードしようとしてトラブルになるかもしれないよう注意することができYAML内の文字列のための統一された表現が必要な場合Syckで投棄された。

+0

これは私が必要なものです!ありがとう! – agate

+0

YAMLパーサーが1.9.3で変更されたことを知りませんでした。ヒントをありがとう! – Eugene

+0

OS X(RVMを介してインストールされている)で 'ruby 1.9.3p194'を実行しています.YAML :: ENGINE.yamlerが' 'psych" '' 08 ''と ' '09 ''。 –

0

これも複製できます。私は何をしているのか分からないが、最初の推測では実際には8進数である文字列の「数字」と関係があるということだ。またはより正確には、最初は8進数で、2番目は8進数ではありません。 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

私はこの動作が非常に奇妙であると感じています。私はjs-yamlのような他のyaml実装についてテストします。彼らは正しい方法でこれを処理するようだ... – agate