【问题标题】:Why text "2e8" is treated as String by YAML on Mac but as Float on Linux in Ruby?为什么文本“2e8”在 Mac 上被 YAML 视为字符串,但在 Ruby 中的 Linux 上被视为浮点数?
【发布时间】:2014-01-21 02:49:24
【问题描述】:

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

  • 对于 Mac:Darwin 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 上生成的转储的一部分,它没有添加这些引号。

【问题讨论】:

  • 它没有回答您的问题,但作为参考,对于 ruby​​ 2.0(和 Psych 版本 2.0.0),我在 linux 上得到了所需的字符串 "2e8"
  • Psych 版本不同,如果在 Linux 上指定 1.2.2 版本会怎样?
  • psych 是基于 3d 方库 libyaml 构建的,所以如果它是动态加载的,那么它的版本也是相关的。

标签: ruby linux osx-lion yaml psych


【解决方案1】:

导致差异的是psych 版本。

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-04-27
      • 2018-07-11
      • 2013-04-20
      • 1970-01-01
      • 1970-01-01
      • 2017-11-20
      • 1970-01-01
      • 1970-01-01
      • 2021-10-26
      相关资源
      最近更新 更多