对于相同的ruby版本,相同的YAML解析器引擎Psych(但不同的次要版本),但不同的操作系统(Mac与Linux),文本"2e8"
在Mac上被视为String
但是Linux上的Float
(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"
我知道添加引号'2e8'
会产生相同的行为,但此文本是Mac上生成的转储的一部分,它不会放置这些引号。
答案 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}}。在另一个系统中,它不具备能力,并将其作为字符串读取。