为什么是文本;2e8“;Mac上的YAML将其视为字符串,而Ruby中的Linux上将其视为浮点?
对于相同的ruby版本,相同的YAML解析器引擎Psych(但不同的次要版本),但不同的操作系统(Mac与Linux),文本为什么是文本;2e8“;Mac上的YAML将其视为字符串,而Ruby中的Linux上将其视为浮点?,ruby,linux,osx-lion,yaml,psych,Ruby,Linux,Osx Lion,Yaml,Psych,对于相同的ruby版本,相同的YAML解析器引擎Psych(但不同的次要版本),但不同的操作系统(Mac与Linux),文本“2e8”在Mac上被视为字符串,但在Linux上被视为浮动(200000000.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
“2e8”
在Mac上被视为字符串,但在Linux上被视为浮动(200000000.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"
我知道添加引号将给出相同的行为,但此文本是Mac上生成的转储文件的一部分,Mac不会添加这些引号。至于为什么部分。严格来说,您必须引用所有字符串,但是如果没有歧义,您可以省略引号。一些YAML引擎会自动执行此操作。数字是一种情况,如果引号不是强制性的,它将被含糊地解读为字符串或数字,因此这种带有纯数字的字符串需要引号,如果没有引号,它们将被识别为数字。您案例中的差异似乎在于YAML引擎是否识别科学符号。在一个系统中,它能够使用科学记数法,因此在科学记数法中也可以作为数字读取的字符串需要将引号识别为字符串。它将读取一个没有引号的2e8
,如2.0x10^8
。在另一个系统中,它没有能力,它将其作为字符串读取 造成差异的是psych
版本
这是相关的承诺:
您大约落后于最新版本两年,因此我建议您是否可以更新对项目的依赖关系
我是怎么找到这个的?使用github出色的比较函数:它没有回答您的问题,但作为参考,对于ruby 2.0(和Psych 2.0.0版),我在linux上得到了所需的字符串“2e8”
。Psych版本不同,如果您在linux上指定1.2.2版本会发生什么?Psych
是在3d party librarylibyaml
上构建的,因此,如果它是动态加载的,那么它的版本也是相关的。