为什么文本“2e8”在Mac上被YAML视为字符串,而在Ruby中用Linux作为Float?

时间:2014-01-03 12:21:32

标签: ruby linux osx-lion yaml psych

对于相同的ruby版本,相同的YAML解析器引擎Psych(但不同的次要版本),但不同的操作系统(Mac与Linux),文本"2e8"在Mac上被视为String但是Linux上的Float200000000.0)。为什么?如何修复它以便它们显示相同的行为?

  • 对于Mac:Darwin 12.4.0 Darwin内核版本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上生成的转储的一部分,它不会放置这些引号。

2 个答案:

答案 0 :(得分:3)

导致差异的psych版本。

这是相关提交:https://github.com/tenderlove/psych/commit/2422a9fc3aeff3c60c6510efbf655a34218c7605

你比最新版本落后了两年,所以我建议你是否可以更新项目的依赖关系。

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

答案 1 :(得分:1)

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