3

同じ ruby​​ バージョン、同じ YAML パーサー エンジン Psych (ただしマイナー バージョンが異なる)、異なる OS (Mac と Linux) の場合、テキストはMac では"2e8"扱われますが、Linux では( ) として扱われます。なんで?同じ動作を示すように修正するにはどうすればよいですか?StringFloat200000000.0

  • Mac の場合: Darwin 12.4.0 Darwin Kernel バージョン 12.4.0: root:xnu-2050.24.15~1/RELEASE_X86_64 x86_64

    require "yaml"
    RUBY_VERSION # => "1.9.3"
    YAML::ENGINE.yamler # => "psych"
    Psych::VERSION # => "1.2.2"
    
    Psych.load("2e8") # => "2e8"
    YAML.load("2e8") # => "2e8"
    YAML.load("'2e8'") # => "2e8"
    
  • Linux の場合: Linux 2.6.18-238.el5 #1 SMP x86_64 GNU/Linux

    require "yaml"
    RUBY_VERSION # => "1.9.3"
    YAML::ENGINE.yamler # => "psych"
    Psych::VERSION # => "1.2.1"
    
    Psych.load("2e8") # => 200000000.0
    YAML.load("2e8") # => 200000000.0
    YAML.load("'2e8'") # => "2e8"
    

引用符を追加して'2e8'も同じ動作になることはわかっていますが、このテキストは Mac で生成されたダンプの一部であり、これらの引用符は配置されません。

4

2 に答える 2

3

psych違いを引き起こしているのはバージョンです。

これは関連するコミットです: https://github.com/tenderlove/psych/commit/2422a9fc3aeff3c60c6510efbf655a34218c7605

最新バージョンから約 2 年遅れているため、プロジェクトへの依存関係を更新できるかどうかをお勧めします。

どうやってこれを見つけたのですか?github の優れた比較機能を使用: https://github.com/tenderlove/psych/compare/v1.2.1...v1.2.2

于 2014-01-03T12:41:54.353 に答える
1

なぜの部分について。厳密にはすべての文字列を引用符で囲む必要がありますが、あいまいでない場合は引用符を省略できます。そして、一部の YAML エンジンはそれを自動的に行います。数字は、引用符が必須でない場合、文字列または数字として曖昧に読み取られる場合であるため、純粋な数字を含む文字列には引用符が必要であり、引用符がないと、数字として認識されます。あなたの場合の違いは、YAML エンジンが科学表記法を認識するかどうかにあるようです。1 つのシステムでは、科学的表記法が可能であるため、科学的表記法で数値としても読み取ることができる文字列は、引用符を文字列として認識する必要があります。2e8引用符なしの裸を2.0 X 10^8. 他のシステムでは、それはできず、文字列として読み取ります。

于 2014-01-03T12:36:37.463 に答える