3

对于相同的 ruby​​ 版本,相同的 YAML 解析器引擎 Psych(但不同的次要版本),但不同的操作系统(Mac 与 Linux),文本在 Mac 上"2e8"被视为,但在 Linux 上被视为( )。为什么?我该如何解决它,以便他们表现出相同的行为?StringFloat200000000.0

  • 对于 Mac:达尔文 12.4.0 达尔文内核版本 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

你比最新版本晚了大约两年,所以我建议你是否可以更新你对项目的依赖。

我是怎么找到这个的?使用github优秀的比较功能:https ://github.com/tenderlove/psych/compare/v1.2.1...v1.2.2

于 2014-01-03T12:41:54.353 回答
1

至于为什么部分。严格来说,您必须引用所有字符串,但是当没有歧义时,您可以省略引号。一些 YAML 引擎会自动执行此操作。数字是一种情况,如果引号不是强制性的,它会被模棱两可地读作字符串或数字,因此这种带有纯数字的字符串需要引号,而如果没有引号,它们将被识别为数字。您的情况的区别似乎在于 YAML 引擎是否识别科学记数法。在一个系统中,它可以使用科学计数法,因此也可以将字符串读取为科学计数法中的数字,因此需要将引号识别为字符串。它将读取一个2e8不带引号的裸词作为2.0 X 10^8. 在另一个系统中,它没有能力,并将其作为字符串读取。

于 2014-01-03T12:36:37.463 回答